2013-02-26 16 views
7

Ich habe eine Testklasse (basierend auf TestNG), wo ich für ein Spy-Objekt verwende.Mockito Spy zurücksetzen

Dies funktioniert:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 
} 

Aber hier:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 

ich eine Mokito Ausnahme erhalten, dass ich mehr als einen Aufruf von someMethodNeedToBeChecked Methode haben. Natürlich habe ich versucht, Mockito.reset(testObject) hinzuzufügen, aber es hat mir überhaupt nicht geholfen.

Wie kann ich ein Spy-Objekt zurücksetzen, wenn ich die gleiche Methode in mehreren Tests überprüfen muss?

+0

ich http://programmers.stackexchange.com/questions/188299/is-this-an- eine ähnliche Frage über gefragt Appropriate-Use-of-Mockitos-Reset-Methode. Nur zur Info, obwohl das mit einem Spott nicht zu tun hat. –

+0

Wo haben Sie versucht, den Aufruf zu 'reset' hinzuzufügen? Vielleicht deinen Code bearbeiten, um deinen Versuch zu zeigen, aber auskommentiert? –

+0

Ich habe nur Prototyp Beispiel, Reset Ich habe versucht, in @BeforeMethod \ @BeforeClass, das gleiche mit @After, noch vor der Verifikation - es hat nicht funktioniert. Wie ich es verstehe, ist es ein Problem nur mit Spionen und Reset ist nur für Mock-Objekte. –

Antwort

12

Vom Mockito documentation:

Zurücksetzen Mocks (seit 1.8.0)

Smart-Mockito Benutzer kaum diese Funktion nutzen, weil sie es wissen, ist ein Zeichen für schlechte Tests sein könnte. Normalerweise müssen Sie Ihre Mocks nicht zurücksetzen, sondern nur neue Mocks für jede Testmethode erstellen. Anstelle von reset() schreiben Sie bitte einfache, kleine und fokussierte Testmethoden über lange, überspezifizierte Tests. Der erste potentielle Code-Geruch wird in der Mitte der Testmethode zurückgesetzt(). Dies bedeutet wahrscheinlich, dass Sie zu viel testen. Folgen Sie dem Flüstern Ihrer Testmethoden: "Bitte halten Sie uns klein & konzentrierte sich auf einzelnes Verhalten". Es gibt mehrere Threads darüber auf der Mockito Mailingliste.

Der einzige Grund, warum wir die reset() -Methode hinzugefügt haben, ist, dass es möglich ist, mit Container-injizierten Mocks zu arbeiten.

Sie sollten wahrscheinlich nur den Spion in ein @BeforeMethod neu:

public class Program { 

    private TestObject testObject = new TestObject(); 
    private TestObject spyTestObject; 

    @BeforeMethod 
    public void buildSpy() { 
     spyTestObject = spy(testObject); 
    } 

    @Test 
    public void test1() { 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 
+0

Ich verstehe nicht, warum Sie sagen, dass jeder Test jetzt zwei Aufrufe erwarten muss. Der Spion wird vor jeder Testmethode neu aufgebaut. –

+0

Sorry, ich habe deine Antwort falsch gelesen :-) –

+0

Danke, eigentlich hat es mir geholfen, aber wenn du Annotierungen wie @InjectMocks und andere verwendest, musst du dort auch Initmocks nennen, die nicht so schön zu sein scheinen. –