2013-05-21 9 views
16

Mit dem einfachsten Beispiel von Mockito's examples page kann ich erfolgreich in JUnit ausgeführt werden.Einfache Mockito Verify funktioniert in JUnit aber nicht Spock

Wenn ich jedoch den gleichen Test in Spock ausführen, schlägt es fehl.

JUnit/Java-Version (das geht):

import org.junit.Test; 

import java.util.List; 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

public class SimpleJunitTest 
{ 
    @Test 
    public void basicMockTest() 
    { 
     List mockedList = mock(List.class); 

     //using mock object 
     mockedList.add("one"); 
     mockedList.clear(); 

     //verification 
     verify(mockedList).add("one"); 
     verify(mockedList).clear(); 
    } 
} 

Spock/Groovy Version (dies fehlschlägt):

import static org.mockito.Mockito.mock 
import static org.mockito.Mockito.verify 


class SimpleSpockTest extends spock.lang.Specification 
{ 
    def "Basic Mock Test"() 
    { 
     given: 
      //mock creation 
      List mockedList = mock(List.class); 

     when: 
      //using mock object 
      mockedList.add("one"); 
      mockedList.clear(); 

     then: 
      //verification 
      verify(mockedList).add("one"); 
      verify(mockedList).clear(); 
    } 

} 

Hier ist der Fehler, den ich, wenn der Spock-Test bekommen schlägt fehl:

Condition not satisfied: 

verify(mockedList).add("one") 
|  |   | 
|  |   false 
|  [email protected] (renderer threw  
NullPointerException) 
[email protected] (renderer threw 
NullPointerException) 

at SimpleSpockTest.Basic Mock Test(SimpleSpockTest.groovy:25) 

Irgendwelche Ideen oder Vorschläge? Ich mag Spock und Mockito sehr und hoffe, dass sie gut zusammenarbeiten. Vielen Dank!

Antwort

17

Grob gesagt, ein Then-Block darf nur Aussagen in Form von booleschen Ausdrücken enthalten. Ein Mockito-Verifikationsausdruck passt nicht zu diesem Vertrag, da er beim Passieren einen Falsy-Wert (null, false,) zurückgibt, der von Spock als fehlgeschlagene Assertion interpretiert wird.

Um dieses Problem zu lösen, können Sie entweder eine Hilfsmethode schreiben, die die Verifikationsausdrücke umschließt und immer true zurückgibt, oder Sie können Spocks eingebautes Mockito-Framework anstelle von Mockito verwenden.

+0

Ich muss sagen, ich habe versucht, es zu vermeiden, aber Spokes gefälschte Bestätigungsfehlermeldungen sind ziemlich verdammt großartig. –

+0

Danke. Große Fehlermeldungen sind sicherlich ein Markenzeichen von Mockito. Glücklicherweise bekomme ich regelmäßig Feedback von Szczepan (Schöpfer von Mockito), wie man Spock-Fehlermeldungen verbessern kann, und die meiste Zeit höre ich zu, was er sagt. :-) –

+8

Ich komme darauf nach einer Weile zurück, da ich einige Spring-Komponenten verspotten muss und das immer noch nicht mit Spock-Mocks machen kann, und ich habe festgestellt, dass 'Mockito.verify (mock). foo (bar) || true' funktioniert gut für mich und ist einigermaßen lesbar. – chrylis

Verwandte Themen