J'ai une application Spring-Boot où les propriétés par défaut sont définies dans un fichier application.properties
dans le chemin d'accès aux classes (src/main/resources/application.properties).
J'aimerais remplacer certains paramètres 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 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é qu'utiliser @PropertySource("classpath:test.properties")
dans la classe TestConfig ferait l'affaire, mais que ces propriétés ne remplaceraient pas les paramètres application.properties (voir Doc - Référence de Spring-Boot - 23. Configuration externalisée ).
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. Donc je le mets 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 été couronnée de succès.
Il doit y avoir une solution simple sur la façon de remplacer les paramètres application.properties
dans les tests JUnit avec test.properties
que j'ai dû oublier.
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 système et d'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 { }
Spring Boot charge automatiquement src/test/resources/application.properties
, si les annotations suivantes sont utilisées
@RunWith(SpringRunner.class)
@SpringBootTest
Donc, renommez test.properties
en application.properties
pour utiliser la configuration automatique.
Si vous * uniquement * devez charger le fichier de propriétés (dans l'environnement), vous pouvez également utiliser les éléments suivants, comme expliqué ici
@RunWith(SpringRunner.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
[Update: remplacement de certaines propriétés pour le test]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Cela charge les propriétés application.properties
et thenapplication-test.properties
dans le contexte d'application du cas de test, conformément aux règles définies ici .
Démo - https://github.com/mohnish82/so-spring-boot-testprops } _
Une autre approche appropriée pour remplacer quelques propriétés dans votre test, si vous utilisez l'annotation @SpringBootTest
:
@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})
Donc, ce qui est fait était d'avoir le src/main/resources/application.properties
standard et aussi un src/test/resources/application-default.properties
où je remplace certains paramètres pour TOUS mes tests.
J'ai rencontré le même problème et je n'utilisais pas de profils non plus. Cela semblait gênant de devoir le faire maintenant et de vous souvenir d'avoir déclaré le profil - ce qui peut facilement être oublié.
L'astuce consiste à tirer parti du fait qu'un application-<profile>.properties
spécifique au profil 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-specific-properties
Sinon, nous pouvons changer le nom du configurateur de propriété 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 configurée automatiquement à partir de ce test.properties séparé, en ignorant les propriétés de l'application;
Avantage: configuration automatique des tests;
Inconvénient: exposer la propriété "spring.config.name" au CI. couche
ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
spring.config.name = application # nom du fichier de configuration
Vous pouvez également créer un fichier application.properties dans src/test/resources où vos JUnits sont écrits.