2016-04-18 7 views
3

Wenn ich Mocks für Komponententests verwende, muss ich oft prüfen, ob eine bestimmte Methode des Mocks aufgerufen wird mit den richtigen Argumenten. Das bedeutet, dass ich irgendwie einen Weg finden muss, um zu sehen, was an die betreffende Methode weitergegeben wird.Die Verifizierungsmethode von Mockito stört die Überprüfung von DoAnswer

1 * serviceMock.operate(*_) >> { args -> 
    def argument = args[0] 
    assert expectedValue = argument.actualValue 
} 

Mit Mockito (und JUnit), dem einzigen Weg, ich glaube, dies getan ist durch die Verwendung doAnswer und verify, so etwas wie sein kann: In Spock kann dies wie mit etwas getan wird

doAnswer(new Answer() { 
    //check arguments here 
}).when(service).operate(any(Data.class)); 

dann muss ich überprüfen, ob die Operation tatsächlich mit aufgerufen wird:

verify(service).operate(any(Data.class)); 

der obige Code jedoch stört doAnswer, als ob es ein Akt ist Aufruf an die betreffende Methode. Wie kann ich das umgehen, damit ich beide überprüfen kann, dass die Methode aufgerufen wird, und überprüfe, ob die Argumente korrekt sind?

+0

haben Sie versuchen ArgumentCaptor ? –

+0

[diese Frage] (http://stackoverflow.com/questions/12295891/how-to-use-argumentcaptor-for-stubbing) sollte nützlich sein – troig

+0

Nein, ich habe noch nie zuvor davon gehört. –

Antwort

0

Mockito überprüft Argumentwerte im natürlichen Java-Stil: mit einer equals() -Methode. Dies ist auch die empfohlene Methode zum Vergleich von Argumenten, da dadurch Tests einfacher gemacht werden können.

ArgumentCaptor<Data> argument = ArgumentCaptor.forClass(Data.class); 
verify(service).operate(argument.capture()); 
assertEquals("John", argument.getValue().getDataName()); 

mehr beziehen here

Ich hoffe, dass dies hilfreich sein wird

+0

Es sagt mir, dass kein Wert erfasst wird. Spezifiziere ich diese Zeilen vor dem eigentlichen Anruf oder danach? –

+0

nur Klarstellung, in diesem Kontext, senden Sie Datenobjekt zur Methode funktionieren? –

+0

Du meinst im eigentlichen Aufruf zum Mock? Ja. Ich habe einen Aufruf an 'service.operate (actualData);'. –

Verwandte Themen