J'aimerais écrire des tests qui vérifient la configuration XML Spring d'un fichier WAR déployé. Malheureusement, certains beans nécessitent que certaines variables d'environnement ou propriétés système soient définies. Comment définir une variable d'environnement avant l'initialisation des beans spring en utilisant le style de test pratique avec @ContextConfiguration?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Si je configure le contexte d'application avec des annotations, je ne vois pas de crochet permettant de faire quelque chose avant que le contexte de ressort ne soit initialisé.
Vous pouvez initialiser la propriété System dans un initialiseur statique:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {
static {
System.setProperty("myproperty", "foo");
}
}
Le code d'initialisation statique sera exécuté avant l'initialisation du contexte de l'application Spring.
Pour ce faire, à partir de Spring 4.1, utilisez un @TestPropertySource
annotation.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
...
}
Voir @TestPropertySource dans les Spring Docs et Javadocs .
On peut également utiliser un test ApplicationContextInitializer pour initialiser une propriété système:
public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
@Override
public void initialize(ConfigurableApplicationContext applicationContext)
{
System.setProperty("myproperty", "value");
}
}
puis configurez-le sur la classe de test en plus des emplacements de fichier de configuration de contexte Spring:
@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}
De cette façon, la duplication de code peut être évitée si une certaine propriété système doit être définie pour tous les tests unitaires.
Vous pouvez définir les propriétés système en tant que VM arguments.
Si votre projet est un projet maven, vous pouvez exécuter la commande suivante lors de l'exécution de la classe de test:
mvn test -Dapp.url="https://stackoverflow.com"
Classe de test:
public class AppTest {
@Test
public void testUrl() {
System.out.println(System.getProperty("app.url"));
}
}
Si vous voulez exécuter une classe ou une méthode de test individuelle dans Eclipse, alors:
1) Allez à Exécuter -> Exécuter la configuration
2) Sur le côté gauche, sélectionnez votre classe de test sous la section Junit.
3) procédez comme suit:
Actuellement, toutes les réponses ne parlent que des propriétés système qui sont différentes des variables d’environnement plus complexes à définir, en particulier. pour les tests. Heureusement, en dessous de la classe peut être utilisé pour cela et la classe docs a de bons exemples
Un exemple rapide tiré de la documentation, modifié pour fonctionner avec @SpringBootTest
@SpringBootTest
public class EnvironmentVariablesTest {
@ClassRule
public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");
@Test
public void test() {
assertEquals("value", System.getenv("name"));
}
}
Si vous voulez que vos variables soient valides pour tous les tests, vous pouvez avoir un application.properties
fichier dans votre répertoire de ressources de test (par défaut: src/test/resources
) qui ressemblera à ceci:
MYPROPERTY=foo
Ceci sera alors chargé et utilisé à moins que vous n'ayez des définitions via @TestPropertySource
ou une méthode similaire - vous trouverez l’ordre exact dans lequel les propriétés sont chargées dans le chapitre Documentation Spring 24. Configuration externalisée .
Pour les tests unitaires, la variable système n’est pas encore instanciée lorsque je fais "mvn clean install", car aucun serveur n’exécute l’application. Donc, afin de définir les propriétés système, je dois le faire dans pom.xml. Ainsi:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<systemPropertyVariables>
<propertyName>propertyValue</propertyName>
<MY_ENV_VAR>newValue</MY_ENV_VAR>
<ENV_TARGET>olqa</ENV_TARGET>
<buildDirectory>${project.build.directory}</buildDirectory>
</systemPropertyVariables>
</configuration>
</plugin>