2016-08-31 3 views
3

Mit JUnit zum TestenJMockit Mock nicht immer zerstört

classes-

eine Klasse TestAccess.java mit

static private TestAccess instance = new TestAccess(); 
public static TestAccess getTestAccess() { 
    returns instance; 
} 

Für eine Testklasse Testen A.java verwendet JMockit die getTestAccess Methode

@Mock 
TestAccess mockTestaccess;  

@Test 
public void testMethod() { 
    new MockUp<TestAccess>() { 
     @mockit.Mock 
     public TestAccess getTestAccess() { 
      return mockTestaccess; 
     } 
    }; 

    TestAccess test=TestAccess.getTestAccess(); 
} 

zu verspotten In einer anderen Klasse B.java möchte ich nicht Mock verwenden und anrufenwie folgt

@Test 
public void doTest() 
{ 
    TestAccess test=TestAccess.getTestAccess(); 
} 

B.java wenn unabhängig laufen gelassen, die wirkliche TestAccess Instanz zurückgegeben wird und funktioniert einwandfrei.

jedoch während Maven führen Sie es wie auch in B.java die TestAccess.getTestAccess() Rückkehr der Mock in A.java und nicht die wirkliche Instanz wie erwartet definiert ausfällt.

Könnte jemand sagen, wie dies gelöst werden kann.

Antwort

1

Versuchte

MockUp<TestAccess> mockTestAccess=new MockUp<TestAccess>() { 

    @Mock 
    public TestAccess getTestAccess() { 
     return mockTestaccess; 
    } 
}; 

dann in Nachbearbeitungs mockTestAccess.tearDown()

haben es funktioniert jetzt.

+2

Laut JMockit-Entwickler ist es fast immer ein Zeichen falscher Verwendung, wenn Sie 'tearDown()' explizit aufrufen müssen. Dies sollte niemals notwendig sein. Ein Mock wird automatisch zurückgesetzt, wenn der Bereich verlassen wird, in dem der 'MockUp' definiert ist. Sie haben jedoch zu wenig Details zu Ihrem Code angegeben, um den von Ihnen gemachten Fehler zu sehen. – Vampire

+0

Haben einige Details hinzugefügt .. versuchen, weitere Details zu teilen, wenn dies nicht genug ist. – Rameez

1

Wenn Ihr Beispiel nicht ausgeführt wird, ist die @Mock Annotation im Feld mockTestaccess nicht gültig. Ich denke, es sollte @Mocked sein? Und wenn ja, ist es nicht notwendig, zusätzlich die new MockUp() zu verwenden, da @Mocked on mockTestaccess alle Instanzen von TestAccess bereits während der Tests dieser Testklasse vortäuschen wird und danach automatisch zurückgesetzt wird. Wenn das Problem ist, dass getTestAccess() eine Unterklasse von TestAccess zurückgibt, die dann keine verspottete Instanz ist, sollten Sie sich vielleicht @Capturing ansehen, die auch Instanzen von Unterklassen anspricht.

+0

Ich verwende Junit für Komponententests. Verwenden Sie @mock (org.mockito.Mock), um die Instanz nachzuahmen. Da ich eine statische Methode so verspotten wollte nutzte jMockito (mockit.MockUp). Habe gerade die obige Anweisung bearbeitet, um mockit.MockUp einzubinden, was ich verpasst hatte. Auch die Testfälle laufen. – Rameez

+0

Sie mischen zwei verschiedene Frameworks? Warum das? Ich würde empfehlen, keine spöttischen Frameworks zu mischen, sondern nur JMockit zu verwenden. – Vampire

Verwandte Themen