Wie System.getenv (String) JMockit?
-
06-07-2019 - |
Frage
Was ich habe jetzt
Ich habe eine 3rd-Party-Singleton-Instanz, die meine Klasse unter Test stützt sich auf und das Singleton System.getenv(String)
in seinem Konstruktor verwendet. Ist es möglich, diesen Aufruf zu verspotten?
Ich habe versucht, diese
JMockit Beispiel
new Expectations()
{
System mockedSystem;
{
System.getenv( "FISSK_CONFIG_HOME" ); returns( "." );
}
};
Aber es gibt mir eine EXCEPTION_ACCESS_VIOLATION
und stürzt die JVM.
Gibt es eine andere Art und Weise eine Systemumgebungsvariable für einen Unit-Test zu setzen?
Lösung
In diesem Fall müssen Sie teilweise spöttisch verwenden, so dass JMockit nicht alles in der System-Klasse neu definieren. Der folgende Test wird übergeben:
@Test
public void mockSystemGetenvMethod()
{
new Expectations()
{
@Mocked("getenv") System mockedSystem;
{
System.getenv("envVar"); returns(".");
}
};
assertEquals(".", System.getenv("envVar"));
}
Ich werde bald eine Erweiterung implementieren, so dass Fragen wie diese nicht auftreten, wenn JRE Klassen spöttisch. Es sollte in Release 0.992 oder 0.993 zur Verfügung.
Andere Tipps
PowerMock Nähte mock Systemklassen zu können.
Die andere Option (vorausgesetzt, Sie sind nicht Einheit die 3rd-Party-API Prüfung) ist ein zu schaffen für Fassade den 3rd-Party-API, die einen schönen, einfachen mockable Schnittstelle hat und haben Ihre Testklassen diese verwenden, anstatt die reale Sache.
Oh, unterstützt JMockit auch dies: Paket Spieltest;
import static org.junit.Assert.*;
import mockit.*;
import mockit.integration.junit4.JMockit;
import org.junit.*;
import org.junit.runner.RunWith;
@RunWith(JMockit.class)
public class JMockItTest {
@Test
public void mockSystemGetEnv() {
Mockit.setUpMocks(MockSystem.class);
assertEquals("Bye", System.getenv("Hello"));
}
@MockClass(realClass = System.class)
public static class MockSystem {
@Mock
public static String getenv(String str) {
return "Bye";
}
}
}
Sie können nicht die Umgebung ändern, aber Sie können den Zugang ändern. Einfach den Anruf wickeln in einem Verfahren oder eine Hilfsklasse System.getenv()
und dass dann spotten
[EDIT] Jetzt ist Ihr Problem ist, wie Sie den Code Ihrer Dritten Bibliothek zu ändern. Die Lösung hier ist eine Java Decompiler zu verwenden und die Klasse zu beheben. Wenn Sie möchten, können Sie in einem Feature-Request in auch senden. Fügen Sie diese neue Klasse zu Ihrer Test-Suite. Das sollte Ihre IDE finden die Klasse für die Tests machen.
Da Testcode nicht in der Produktion geht, können Sie Ihre Tests und die Produktion Code ausführen wird die ursprüngliche Bibliothek verwenden.
Vor einiger Zeit wollte ich href="http://www.theeggeadventure.com/wikimedia/index.php/How_to_test_System.exit" rel="nofollow noreferrer"> Test System.exit individuelle Security . Sie können den Anruf überprüfen gemacht wird, und das Argument des Aufrufs, aber diese Methode verwenden, können Sie nicht den Rückgabewert des Aufrufs verspotten.
Ein Update auf @ Rogério Antwort.
In meinem Fall mit JMockit 1,25 ich es zu tun hatte, die MockUp API:
@Test
public void mockSystemGetenvMethod(){
new MockUp<System>()
{
@Mock
public String getenv(final String string) {
return "";
}
};
assertEquals(".", System.getenv("envVar"));
}