Remplacez les parameters par défaut de l’application Spring-Boot application.properties dans Junit Test

J’ai une application Spring-Boot où les propriétés par défaut sont définies dans un fichier application.properties du classpath (src / main / resources / application.properties).

Je voudrais remplacer certains parameters par défaut de mon test JUnit par des propriétés déclarées dans un fichier test.properties (src / test / resources / test.properties)

J’ai l’habitude d’avoir un cours de configuration dédié 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 de @PropertySource("classpath:test.properties") dans la classe TestConfig ferait l’affaire, mais ces propriétés n’écrasent pas les parameters application.properties (voir Référence du Spring-Boot – Doc. 23. Configuration externalisée ).

Ensuite, j’ai essayé d’utiliser -Dspring.config.location=classpath:test.properties lors de l’appel du test. Cela a été un succès, mais je ne veux pas définir cette propriété système pour chaque exécution de test. Donc je le mets dans le code

 @Configuration @Import(CoreConfig.class) @EnableAutoConfiguration public class TestConfig { static { System.setProperty("spring.config.location", "classpath:test.properties"); } } 

ce qui malheureusement n’a pas encore réussi.

Il doit y avoir une solution simple pour remplacer application.properties parameters application.properties dans les tests JUnit avec test.properties que j’ai dû ignorer.

Vous pouvez utiliser @TestPropertySource pour remplacer les valeurs dans application.properties . De son javadoc:

les sources de propriétés de test peuvent être utilisées pour remplacer sélectivement les propriétés définies dans les sources de propriétés du système et de l’application

Par exemple:

 @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = ExampleApplication.class) @TestPropertySource(locations="classpath:test.properties") public class ExampleApplicationTests { } 

Vous pouvez également utiliser des méta-annotations pour externaliser la configuration. Par exemple:

 @RunWith(SpringJUnit4ClassRunner.class) @DefaultTestAnnotations public class ExampleApplicationTests { ... } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @SpringApplicationConfiguration(classes = ExampleApplication.class) @TestPropertySource(locations="classpath:test.properties") public @interface DefaultTestAnnotations { } 

Spring Boot charge automatiquement src/test/resources/application.properties si les annotations suivantes sont utilisées

 @RunWith(SpringRunner.class) @SpringBootTest 

test.properties donc test.properties en application.properties pour utiliser la configuration automatique.

Si vous * seulement * avez besoin de charger le fichier de propriétés (dans l’environnement), l’utilisation peut également utiliser ce qui suit, comme expliqué ici

 @RunWith(SpringRunner.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[ Mise à jour: Remplacement de certaines propriétés pour les tests ]

  1. Ajoutez src/main/resources/application-test.properties .
  2. Annoter la classe de test avec @ActiveProfiles("test") .

Cela charge application.properties propriétés application-test.properties puis application-test.properties dans le contexte d’application du scénario de test, conformément aux règles définies ici .

Démo – https://github.com/mohnish82/so-spring-boot-testprops

Sinon, nous pouvons changer le nom du configurateur de propriétés par défaut, en définissant la propriété spring.config.name=test , puis en ayant la ressource de chemin de classe src/test/test.properties Notre instance native de org.springframework.boot.SpringApplication sera automatiquement configurée. de cette propriété test.properties séparée, en ignorant les propriétés de l’application;

Avantage: auto-configuration des tests;

Drawback: exposer la propriété “spring.config.name” à la couche CI

ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name = application # Nom du fichier de configuration

TLDR:

Donc, ce qui a été fait était d’avoir le src/main/resources/application.properties standard et aussi un src/test/resources/application-default.properties où je remplace certains parameters pour TOUS mes tests.

Histoire entière

J’ai rencontré le même problème et n’utilisais pas non plus de profils jusqu’à présent. Cela semblait gênant de devoir le faire maintenant et de se rappeler de déclarer le profil – ce qui peut être facilement oublié.

L’astuce consiste à tirer parti d’une application-.properties spécifique à un profil – application-.properties remplace les parameters 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