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. Je voudrais tester ce code avec différentes valeurs de la variable d'environnement. Comment puis-je faire cela dans JUnit?
J'ai vu des moyens 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, d'autant plus que les tests ne devraient pas interférer les uns avec les autres.
Réponses:
La bibliothèque System Rules fournit une règle JUnit pour définir les variables d'environnement.
Avertissement: je suis l'auteur des règles système.
la source
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Vous devrez ajouter la dépendancecom.github.stefanbirkner:system-rules
dans votre projet. Il est disponible dans MavenCentral.La solution habituelle est de créer une classe qui gère l'accès à cette variable d'environnement, que vous pouvez ensuite simuler dans votre classe de test.
La classe testée obtient alors la variable d'environnement en utilisant la classe Environment, et non directement à partir de System.getenv ().
la source
Dans une situation similaire comme celle-ci où je devais écrire un cas de test qui dépend de la variable d'environnement , j'ai essayé de suivre:
J'ai perdu une journée en utilisant les deux approches ci-dessus, mais en vain. Puis Maven est venu à mon secours. Nous pouvons définir des variables d'environnement ou des propriétés système via le fichier Maven POM , ce qui, à mon avis, est le meilleur moyen de faire des tests unitaires pour un projet basé sur Maven . Voici l'entrée que j'ai faite dans le fichier POM .
Après ce changement, j'ai de nouveau exécuté des cas de test et tout a fonctionné comme prévu. Pour l'information du lecteur, j'exploré cette approche dans 3.x Maven , je ne ai aucune idée sur Maven 2.x .
la source
Je pense que le moyen le plus propre de le faire est d'utiliser Mockito.spy (). C'est un peu plus léger que de créer une classe séparée pour se moquer et faire circuler.
Déplacez votre récupération de variable d'environnement vers une autre méthode:
Maintenant, dans votre test unitaire, procédez comme suit:
la source
Je ne pense pas que cela ait encore été mentionné, mais vous pouvez également utiliser Powermockito :
Donné:
Vous pouvez faire ce qui suit:
la source
when(System.getenv("FOO_VAR_1")).thenReturn("test-foo-var-1")
provoque uneorg.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
erreurDécouplez le code Java de la variable Environment en fournissant un lecteur de variable plus abstrait que vous réalisez avec un EnvironmentVariableReader à partir duquel votre code testera les lectures.
Ensuite, dans votre test, vous pouvez donner une implémentation différente du lecteur de variables qui fournit vos valeurs de test.
L'injection de dépendance peut y contribuer.
la source
Cette réponse à la question Comment définir des variables d'environnement à partir de Java? fournit un moyen de modifier la carte (non modifiable) dans System.getenv (). Ainsi, bien que cela ne change pas VRAIMENT la valeur de la variable d'environnement du système d'exploitation, il peut être utilisé pour les tests unitaires car il change ce que System.getenv retournera.
la source
J'espère que le problème est résolu. J'ai juste pensé à dire ma solution.
la source
Même si je pense que cette réponse est la meilleure pour les projets Maven, elle peut également être obtenue via Reflect (testé en Java 8 ):
la source
theCaseInsensitiveEnvironment
et a à la place un champtheEnvironment
, comme le suivant: `` `` envMap = new HashMap <> (); Classe <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Champ theEnvironmentField = clazz.getDeclaredField ("theEnvironment"); Champ theUnmodifiableEnvironmentField = clazz.getDeclaredField ("theUnmodifiableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodifiableEnvironmentField, envMap); ``Eh bien, vous pouvez utiliser la méthode setup () pour déclarer les différentes valeurs de votre env. variables en constantes. Utilisez ensuite ces constantes dans les méthodes de test utilisées pour tester les différents scénarios.
la source
Si vous souhaitez 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és, cette méthode retourne une carte contenant les noms de variable sous forme de clés et les valeurs de variable comme valeurs de carte. Voici un exemple :La méthode
getEnv()
peut également prendre un argument. Par exemple :Pour les tests, je ferais quelque chose comme ceci:
la source
J'utilise System.getEnv () pour obtenir la carte et je la garde en tant que champ, donc je peux me moquer:
la source