Remplacer l'application Spring-Boot par défaut.paramètres de propriétés dans le test Junit
J'ai une application Spring-Boot où les propriétés par défaut sont définies dans un fichier application.properties
dans le classpath (src / main / resources / application.propriété).
Je voudrais remplacer certains paramètres par défaut dans mon test JUnit avec des propriétés déclarées dans un fichier test.properties
(src / test / resources / test.les propriétés)
J'ai généralement 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 de @PropertySource("classpath:test.properties")
dans la classe TestConfig ferait l'affaire, mais ceux-ci les propriétés n'écraseront pas l'application.paramètres de propriétés (voir Référence Spring-Boot Doc - 23. Configuration Externalisée ).
, Puis 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. Ainsi je l'ai mis 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 sur la façon de remplacer les paramètres application.properties
dans les tests JUnit avec {[3] } que je doit être négligé.
5 réponses
Vous pouvez utiliser @TestPropertySource
pour remplacer des 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 système et application
Par exemple:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {
}
Vous pouvez également utiliser 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 { }
Printemps de Démarrage charge automatiquement src/test/resources/application.properties
, si les annotations suivantes sont utilisées
@RunWith(SpringRunner.class)
@SpringBootTest
, renommez test.properties
à application.properties
pour utiliser la configuration automatique.
{Si vous[15]}*seulement* devez charger le fichier de propriétés (dans l'Environnement) peut aussi utiliser, comme expliqué ici
@RunWith(SpringRunner.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
[mise à jour: remplacement de certaines propriétés pour tester ]
- Ajouter
src/main/resources/application-test.properties
. - annoter la classe de test avec
@ActiveProfiles("test")
.
Cette charge application.properties
et , puis application-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
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 une ressource de chemin de classe
src/test/test.properties
notre instance native de org.springframework.boot.SpringApplication
sera configurée automatiquement à partir de ce test séparé.propriétés, ignorant les propriétés de l'application;
Avantage: configuration automatique des tests;
Inconvénient: exposer "spring.config.name" propriété à C. I. layer
Réf: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Spring. config. name=Nom du fichier de configuration de l'application #
TLDR:
Donc, ce qui est fait était d'avoir la norme src/main/resources/application.properties
et aussi un src/test/resources/application-default.properties
où je remplace certains paramètres pour tous mes tests.
Toute L'Histoire
J'ai rencontré le même problème et n'utilisait pas non plus de profils jusqu'à présent. Il semblait être gênant d'avoir à le faire maintenant et n'oubliez pas de déclarer le profil, 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