Ich habe einen Java-Code, der eine Umgebungsvariable verwendet, und das Verhalten des Codes hängt vom Wert dieser Variablen ab. Ich möchte diesen Code mit verschiedenen Werten der Umgebungsvariablen testen. Wie kann ich das in JUnit machen?
Ich habe einige Möglichkeiten gesehen, Umgebungsvariablen in Java im Allgemeinen festzulegen, aber ich bin mehr an Unit-Test-Aspekten interessiert, insbesondere wenn man bedenkt, dass Tests sich nicht gegenseitig stören sollten.
Antworten:
Die Bibliothek System Rules bietet eine JUnit-Regel zum Festlegen von Umgebungsvariablen.
Haftungsausschluss: Ich bin der Autor der Systemregeln.
quelle
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Sie müssen die Abhängigkeitcom.github.stefanbirkner:system-rules
in Ihrem Projekt hinzufügen . Es ist in MavenCentral verfügbar.Die übliche Lösung besteht darin, eine Klasse zu erstellen, die den Zugriff auf diese Umgebungsvariable verwaltet, die Sie dann in Ihrer Testklasse verspotten können.
Die zu testende Klasse erhält dann die Umgebungsvariable mithilfe der Environment-Klasse, nicht direkt von System.getenv ().
quelle
In einer ähnlichen Situation wie diese , wo ich zu schreiben hatte Testfall , die abhängig ist von Umgebungsvariablen , habe ich versucht , folgende:
Ich habe einen Tag mit den beiden oben genannten Ansätzen verschwendet, aber ohne Erfolg. Dann kam Maven zu meiner Rettung. Wir können Umgebungsvariablen oder Systemeigenschaften über die Maven-POM- Datei festlegen. Dies ist meiner Meinung nach der beste Weg, um Unit-Tests für Maven- basierte Projekte durchzuführen . Unten ist der Eintrag, den ich in der POM- Datei gemacht habe.
Nach dieser Änderung führte ich erneut Testfälle aus und plötzlich funktionierten alle wie erwartet. Für Leser Informationen, erkundete ich diesen Ansatz in Maven 3.x , so habe ich keine Ahnung über Maven 2.x .
quelle
Ich denke, der sauberste Weg, dies zu tun, ist mit Mockito.spy (). Es ist etwas leichter als das Erstellen einer separaten Klasse zum Verspotten und Weitergeben.
Verschieben Sie das Abrufen Ihrer Umgebungsvariablen auf eine andere Methode:
Führen Sie nun in Ihrem Komponententest Folgendes aus:
quelle
Ich glaube, das wurde noch nicht erwähnt, aber Sie könnten auch Powermockito verwenden :
Gegeben:
Sie können Folgendes tun:
quelle
when(System.getenv("FOO_VAR_1")).thenReturn("test-foo-var-1")
verursachtorg.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
FehlerEntkoppeln Sie den Java-Code von der Umgebungsvariablen und stellen Sie einen abstrakteren Variablenleser bereit, den Sie mit einem EnvironmentVariableReader für Ihren Code zum Testen von Lesevorgängen realisieren.
Dann können Sie in Ihrem Test eine andere Implementierung des Variablenlesers angeben, der Ihre Testwerte bereitstellt.
Die Abhängigkeitsinjektion kann dabei helfen.
quelle
Diese Antwort auf die Frage Wie setze ich Umgebungsvariablen von Java aus? bietet eine Möglichkeit, die (nicht veränderbare) Karte in System.getenv () zu ändern. Obwohl der Wert der Umgebungsvariablen des Betriebssystems nicht WIRKLICH geändert wird, kann er für Komponententests verwendet werden, da er ändert, was System.getenv zurückgibt .
quelle
Hoffe, das Problem ist behoben. Ich dachte nur daran, meine Lösung zu erzählen.
quelle
Obwohl ich denke, dass diese Antwort die beste für Maven-Projekte ist, kann sie auch über Reflect erreicht werden (getestet in Java 8 ):
quelle
theCaseInsensitiveEnvironment
Feld zu haben und hat stattdessentheEnvironment
Folgendes: `` `envMap = new HashMap <> (); Klasse <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Feld theEnvironmentField = clazz.getDeclaredField ("theEnvironment"); Feld theUnmodizableEnvironmentField = clazz.getDeclaredField ("theUnmodizableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodizableEnvironmentField, envMap); `` `Nun, Sie können die setup () -Methode verwenden, um die verschiedenen Werte Ihrer Umgebung zu deklarieren. Variablen in Konstanten. Verwenden Sie diese Konstanten dann in den Testmethoden, die zum Testen der verschiedenen Szenarien verwendet werden.
quelle
Wenn Sie Informationen über die Umgebungsvariable in Java abrufen möchten, können Sie die folgende Methode aufrufen :
System.getenv();
. Als Eigenschaften gibt diese Methode eine Map zurück, die die Variablennamen als Schlüssel und die Variablenwerte als Map-Werte enthält. Hier ist ein Beispiel :Die Methode
getEnv()
kann auch ein Argument annehmen. Zum Beispiel :Zum Testen würde ich so etwas machen:
quelle
Ich benutze System.getEnv (), um die Karte zu erhalten, und behalte sie als Feld, damit ich sie verspotten kann:
quelle