Défaut de priorité Printemps-Démarrage de l'application.paramètres de propriétés de Test Junit
J'ai un Ressort de Démarrage de l'application, où les propriétés par défaut sont définies dans un application.properties
fichier dans le classpath (src/main/resources/de l'application.les propriétés).
Je voudrais remplacer certains paramètres par défaut dans mon test JUnit avec les propriétés déclarées dans un test.properties
fichier (src/test/resources/test.les propriétés)
J'ai en général une Config de Classe pour mon Junit Tests, par exemple
package foo.bar.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
}
J'ai d'abord pensé que l'utilisation de @PropertySource("classpath:test.properties")
dans le TestConfig classe ferait l'affaire, mais ces propriétés ne va pas remplacer l'application.paramètres de propriétés (voir Spring-Boot de Référence Doc - 23. Extériorisés De Configuration).
Puis j'ai essayé d'utiliser -Dspring.config.location=classpath:test.properties
lors de l'invocation de l'épreuve. Cela a été un succès - mais je ne veux pas définir cette propriété du système pour chaque exécution d'un test. Donc je l'ai mis dans le code
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
qui malheureusement a de nouveau pas réussi.
Il doit y avoir une solution simple sur la façon de remplacer application.properties
paramètres dans JUnit tests avec test.properties
que je dois avoir oublié.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
@TestPropertySource
pour remplacer des valeurs dansapplication.properties
. De son javadoc:Par exemple:
@PropertySource
est pris en charge sur@Configuration
classes, pourquoi ne pas aussi@TestPropertySource
😉 en tout cas - comme prévu, le cadre ne me laisse pas tomber et je vous remercie de nouveau pour répondre à la question.@TestPropertySource
peut accepter uneproperties
argument pour remplacer une propriété inline, comme@TestPropertySource(properties = "myConf.myProp=valueInTest")
, il est utile dans le cas où vous ne voulez pas d'une marque totalement nouveau fichier de propriétés.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
est déjà obsolète, et vous devez l'utiliser@SpringBootTest
src/test/resources/application-test.properties
pourrait être utilisé pour les tests unitaires.test
profil actif.Vous pouvez également utiliser les méta-annotations l'externalisation de la configuration. Par exemple:
Printemps de Démarrage charge automatiquement
src/test/resources/application.properties
, si les annotations suivantes sont utiliséesRenommez
test.properties
àapplication.properties
d'utiliser la configuration automatique.[Mise à jour: substitution de certaines propriétés pour les tests]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Cette charge
application.properties
et puisapplication-test.properties
propriétés dans le contexte de l'application pour le cas de test, selon les règles définies ici.Démo - https://github.com/mohnish82/so-spring-boot-testprops
application.properties
fichiers sur le chemin de la classe (l'un danssrc/main/resources
et un ensrc/test/resources
). Qui garantit que les deux seront prises et qui sera pris en premier?application-test.properties
danssrc/main/resources
et spécifiertest
que le profil actif dans le cas de test.src/test/resources/application.properties
sont chargés lors de la phase de test,src/main/resources/application.properties
est ignoré.application-default.properties
et ils seront pris en considération parce que vous êtes exécutant automatiquement le profil "default" (si pas déclaré tous les autres).application.properties
, pas le test une. Voir stackoverflow.com/q/55297676/1763602src/test/resources
, il utilisesrc/main/resources
. Merci de lire stackoverflow.com/questions/55297676/... et ma réponseapplication.properties
soussrc/test/resources
, il est pris pour des cas de test. Cependant, notez que dans ce cas, que propriétés définies dans ce fichier sont disponibles. Mais comme souvent, nous voulons principal propriétés, avec un peu d'eux, de les remplacer pour notre scénario de test, d'où leActiveProfile
approche de la suggestion.@TestPropertySource
test-props-loading
direction du projet de démonstration. Il est destiné à servir de preuve! Check it out.TLDR:
Donc ce que j'ai fait était d'avoir la norme
src/main/resources/application.properties
et aussi unsrc/test/resources/application-default.properties
où j'ai remplacer certains paramètres pour TOUS mes tests.Toute L'Histoire
J'ai rencontré le même problème et n'a pas été à l'aide de profils que ce soit si loin. Il semblait être gênant d'avoir à le faire maintenant et n'oubliez pas de déclarer le profil, qui peut être facilement oublié.
Le truc, c'est, à l'effet de levier d'un profil spécifique
application-<profile>.properties
remplace les paramètres dans le profil général. Voir https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties.Sinon, on peut modifier la valeur par défaut de la propriété configurateur nom, la définition de la propriété
spring.config.name=test
et puis d'avoir la classe de chemin de ressourcessrc/test/test.properties
notre instance natif deorg.springframework.boot.SpringApplication
sera automatiquement configuré à partir d'séparée de ce test.propriétés, en ignorant les propriétés de l'application;Prestations: auto-configuration des tests;
Inconvénient: l'exposition "le printemps.config.nom de la propriété" au C. I. de la couche de
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
application.properties
n'est pas une option pour moi car je ne veux remplacer certains de la configuration d'origine des valeurs dans le test.Vous pouvez également créer une application.fichier de propriétés dans src/test/resources où votre JUnits sont écrits.
Une autre approche adaptée pour remplacer un peu de propriétés dans votre test, si vous utilisez
@SpringBootTest
annotation: