200 votes

Comment tester du code dépendant de variables d'environnement avec JUnit ?

J'ai un morceau de code Java qui utilise une variable d'environnement et le comportement du code dépend de la valeur de cette variable. J'aimerais tester ce code avec différentes valeurs de la variable d'environnement. Comment puis-je faire cela dans JUnit ?

J'ai vu quelques façons de définir des variables d'environnement en Java en général, mais je suis plus intéressé par l'aspect des tests unitaires, surtout si l'on considère que les tests ne devraient pas interférer les uns avec les autres.

0voto

Madgel Points 1

Vous pouvez essayer de rendre votre code dépendant des propriétés :

public static String host() {
   return firstNonBlank(getenv("HOST"), getProperty("host"), "localhost");
}

Ainsi, dans les tests, vous pouvez facilement ajouter une propriété du système et votre code de production sera précédé par des variables d'environnement :

System.setProperty("HOST", "127.0.0.0");

0voto

Sanjay Bharwani Points 1317

Une approche nette et propre pour utiliser le mocking des variables d'environnement dans les tests unitaires est l'utilisation de l'outil @SystemStub qui fait partie de la dépendance ci-dessous

testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.0.1'

Les changements suivants sont en cours Junit 5 configuration Ajouter ci-dessous à votre classe

@ExtendWith(SystemStubsExtension.class)

et utiliser maintenant

@SystemStub
  private EnvironmentVariables environmentVariables;

vous pouvez maintenant simuler le comportement des variables d'environnement en définissant la clé/valeur requise dans votre test.

Par exemple environmentVariables.set("MY_ENV_VARIABLE", "MY_REQUIRED_VALUE"); et cela fonctionne parfaitement, si votre code utilise des variables d'environnement

 System.getenv().getOrDefault("MY_ENV_VARIABLE", "false");

Attention, il ne s'agit pas d'un simulacre System.getProperties() il ne fonctionne que pour System.getenv()

-2voto

Cygnusx1 Points 2820

Vous pouvez utiliser la méthode setup() pour déclarer les différentes valeurs de vos variables env. dans des constantes. Ensuite, utilisez ces constantes dans les méthodes de test utilisées pour tester les différents scénarios.

-2voto

ejaenv Points 353

J'utilise System.getEnv() pour obtenir la carte et je la garde en tant que champ, afin de pouvoir la simuler :

public class AAA {

    Map<String, String> environmentVars; 

    public String readEnvironmentVar(String varName) {
        if (environmentVars==null) environmentVars = System.getenv();   
        return environmentVars.get(varName);
    }
}

public class AAATest {

         @Test
         public void test() {
              aaa.environmentVars = new HashMap<String,String>();
              aaa.environmentVars.put("NAME", "value");
              assertEquals("value",aaa.readEnvironmentVar("NAME"));
         }
}

-3voto

Dimitri Points 2261

Si vous voulez récupérer des informations sur la variable d'environnement en Java, vous pouvez appeler la méthode : System.getenv(); . En tant que propriété, cette méthode renvoie une carte contenant les noms des variables comme clés et les valeurs des variables comme valeurs de la carte. Voici un exemple :

    import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n", envName, env.get(envName));
        }
    }
}

La méthode getEnv() peut également prendre un argument. Par exemple :

String myvalue = System.getEnv("MY_VARIABLE");

Pour les tests, je ferais quelque chose comme ceci :

public class Environment {
    public static String getVariable(String variable) {
       return  System.getenv(variable);
}

@Test
 public class EnvVariableTest {

     @Test testVariable1(){
         String value = Environment.getVariable("MY_VARIABLE1");
         doSometest(value); 
     }

    @Test testVariable2(){
       String value2 = Environment.getVariable("MY_VARIABLE2");
       doSometest(value); 
     }   
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X