je travaille sur Junit5. Mon code java utilise le System.getenv ("demoVar") pour accéder à la variable d'environnement. Alors, comment configurer cette variable d'environnement dans la classe de test jUnit5, afin que mon code puisse accéder à la valeur de cette variable d'environnement pendant le test.
3 Réponses :
La pratique courante consiste à utiliser les propriétés système au lieu des variables d'environnement. Dans ce cas, vous exécuterez votre commande java / maven / gradle ou tout ce que vous utiliserez pour exécuter vos tests avec l'option -D demoVar = "{votre_valeur}". pour objectif maven:
$env:demoVar = 'test'; mvn clean install
pour java jar:
demoVar="test" mvn clean install
Vous pourrez l'obtenir à partir du code avec System.getProperty("demoVar")
.
Si vous avez vraiment besoin d'utiliser la variable d'environnement, utilisez la fonctionnalité du système d'exploitation. Pour Linux:
java -jar xxx.jar -DdemoVar="test"
Pour Windows PowerShell:
maven clean install -DdemoVar="test"
Vous ne pouvez pas dans le processus Java réel, car ces valeurs environnementales utilisant getenv sont immuables .
Une façon serait de démarrer une autre VM ou un autre processus où vous pourriez introduire votre nouvelle valeur d'environnement.
Une autre façon serait de basculer vers System.getProperty , mais assurez-vous de bien comprendre les différences.
https://www.baeldung.com/java-system-get-property-vs-system-getenv
Voici un petit testcode:
public class EnvironmentVarsTest { private static int counter = 0; @BeforeEach public void setUp() { counter = counter + 1; System.setProperty("simple_test_env_property", String.valueOf(counter)); } @Test public void testFirst() { printOutValues(); } @Test public void testSecond() { printOutValues(); } private void printOutValues() { System.out.println("--------------------"); System.out.println("val=" + counter); System.out.println("envval=" + System.getProperty("simple_test_env_property")); } }
Il existe un hack qui vous permet de définir des variables d'environnement pour le processus actuel à partir du code Java. Ce n'est pas joli et vous ne devriez pas l'utiliser à moins d'en avoir vraiment besoin. D'un autre côté, Java devrait vraiment avoir une méthode appropriée pour le faire sans recourir à des hacks.
Cela peut être réalisé avec https://github.com/webcompere/system-stubs/tree/master/system-stubs-jupiter
@ExtendWith(SystemStubsExtension.class) class TestClass { @SystemStub private EnvironmentVariables environmentVariables = new EnvironmentVariables("demoVar", "val"); @Test void test() { // can use the environment assertThat(System.getenv("demoVar")).isEqualTo("val"); // can also change the environment environmentVariables.set("foo", "bar"); // environment variables restored to previous state when // test ends } }
Pourquoi a-t-il été marqué comme dupliqué? La réponse à la question en double concerne les propriétés système Java. Celui-ci concerne les variables d'environnement. System.getenv est complètement différent de System.getProperty. Essayez d'utiliser System.setEnv ("", "") !! :) Donc, cette réponse n'est pas valable pour cette question. La bonne réponse devrait être une alternative aux règles système dans JUnit5
ce n'est clairement pas un doublon comme mentionné par @angelcervera
Avec Java 8, vous pouvez modifier votre méthode qui appelle System.getenv () afin qu'elle utilise à la place une Function <String, String>. Dans votre code de production, vous utiliseriez System :: getenv, et dans votre code de test, vous pouvez utiliser Map :: get sur une carte interne que vous avez remplie avec des valeurs de test.