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?

War es hilfreich?

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"));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top