web-dev-qa-db-fra.com

Comment définir la variable d'environnement ou la propriété système dans les tests de printemps?

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é.

79
Hans-Peter Störr

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.

105
Jimmy Praet

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 .

73
Raman

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.

7
anre

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:

enter image description here

2

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

EnvironmentVariables.html

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"));
   }
 }
2

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 .

1
blalasaadri

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>
0
Gene