J'ai une application Spring-Boot où les propriétés par défaut sont définies dans un application.properties
fichier dans le chemin de classe (src / main / resources / application.properties).
Je voudrais remplacer certains paramètres par défaut dans mon test JUnit avec des propriétés déclarées dans un test.properties
fichier (src / test / resources / test.properties)
J'ai habituellement une classe de configuration dédiée pour mes tests Junit, 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 @PropertySource("classpath:test.properties")
de la classe TestConfig ferait l'affaire, mais ces propriétés n'écraseront pas les paramètres application.properties (voir le document de référence Spring-Boot - 23. Externalized Configuration ).
Ensuite, j'ai essayé d'utiliser -Dspring.config.location=classpath:test.properties
lors de l'appel du test. Cela a réussi - mais je ne veux pas définir cette propriété système pour chaque exécution de test. Je l'ai donc mis dans le code
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
qui malheureusement n'a de nouveau pas réussi.
Il doit y avoir une solution simple sur la façon de remplacer les application.properties
paramètres dans les tests JUnit avec ce test.properties
que j'ai dû ignorer.
la source
Réponses:
Vous pouvez utiliser
@TestPropertySource
pour remplacer les valeurs dansapplication.properties
. De son javadoc:Par exemple:
la source
@TestPropertySource
peut accepter unproperties
argument pour remplacer certaines propriétés en ligne, par exemple@TestPropertySource(properties = "myConf.myProp=valueInTest")
, il est utile dans le cas où vous ne voulez pas un fichier de propriété totalement nouveau.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
est déjà obsolète et que vous devriez utiliser@SpringBootTest
Spring Boot se charge automatiquement
src/test/resources/application.properties
si les annotations suivantes sont utiliséesDonc, renommez-
test.properties
leapplication.properties
pour utiliser la configuration automatique.[ Mise à jour: remplacement de certaines propriétés pour les tests ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Cela se charge
application.properties
, puis lesapplication-test.properties
propriétés dans le contexte d'application pour le scénario de test, selon les règles définies ici .Démo - https://github.com/mohnish82/so-spring-boot-testprops
la source
application.properties
fichiers sur le chemin de classe (un ensrc/main/resources
et un ensrc/test/resources
). Qui garantit que les deux seront prises et laquelle sera prise en premier?application-test.properties
àsrc/main/resources
et précisertest
que le profil actif dans le cas de test.src/test/resources/application.properties
sont chargées pendant la phase de test,src/main/resources/application.properties
est ignorée.application-default.properties
et elles seront prises en compte car vous exécutez automatiquement le profil "par défaut" (s'il n'est pas déclaré autre).Vous pouvez également utiliser des méta-annotations pour externaliser la configuration. Par exemple:
la source
Une autre approche appropriée pour remplacer quelques propriétés dans votre test, si vous utilisez des
@SpringBootTest
annotations:la source
SpringBootTest
charger le fichier application.properties?TLDR:
Donc, ce que j'ai fait, c'est d'avoir la norme
src/main/resources/application.properties
et aussi unsrc/test/resources/application-default.properties
endroit où je remplace certains paramètres pour TOUS mes tests.Histoire entière
J'ai rencontré le même problème et n'utilisais pas de profils non plus jusqu'à présent. Cela semblait gênant de devoir le faire maintenant et de se souvenir d'avoir déclaré le profil - ce qui peut être facilement oublié.
L'astuce consiste à tirer parti du fait qu'un profil spécifique
application-<profile>.properties
remplace les paramètres du 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 .la source
Explication simple:
Si vous êtes comme moi et que vous avez le même
application.properties
danssrc/main/resources
etsrc/test/resources
, et vous vous demandez pourquoi leapplication.properties
dans votre dossier de test ne remplace pas leapplication.properties
dans vos ressources principales, lisez la suite ...Si vous avez
application.properties
soussrc/main/resources
et le mêmeapplication.properties
soussrc/test/resources
, quiapplication.properties
est ramassé, dépend de la façon dont vous exécutez vos tests . Le dossier la structuresrc/main/resources
etsrc/test/resources
, est une convention d' architecture Maven, donc si vous exécutez votre test commemvnw test
ou mêmegradlew test
, l'application.properties
ensrc/test/resources
aurez ramassé, comme épreuve classpath précédera principale classpath. Mais, si vous exécutez votre test commeRun as JUnit Test
dans Elipse / STS, l'application.properties
en nesrc/main/resources
sera pas repris, comme principaux précède classpath essai classpath.Vous pouvez le vérifier en ouvrant le
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Vous verrez quelque chose comme:
Voyez-vous que \ main vient en premier, puis \ test ? Bon, tout est question de chemin de classe :-)
À votre santé
la source
la source
Si vous utilisez Spring 5.2.5 et Spring Boot 2.2.6 et souhaitez remplacer uniquement quelques propriétés au lieu du fichier entier. Vous pouvez utiliser la nouvelle annotation: @DynamicPropertySource
la source
Sinon, nous pouvons changer le nom du configurateur de propriétés par défaut, définir la propriété
spring.config.name=test
, puis avoir la ressource de chemin de classe dontsrc/test/test.properties
notre instance nativeorg.springframework.boot.SpringApplication
sera automatiquement configurée à partir de ce test.properties séparé, en ignorant les propriétés de l'application;Avantage: auto-configuration des tests;
Inconvénient: exposition de la propriété "spring.config.name" au niveau de la couche CI
réf: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
la source
application.properties
n'est pas une option pour moi car je veux seulement remplacer certaines des valeurs de configuration d'origine dans le test.Vous pouvez également créer un fichier application.properties dans src / test / resources où vos JUnits sont écrites.
la source