2017-07-28 4 views
2

In Mockito, ich möchte eine Methode verspotten, die einen Wert zurückgibt und hat auch einen RückrufMockito: Mock beide Rückgabewert mit Callback-Methode

Zum Beispiel aufrufen, hier ist der Service-Methode:

String fetchString(Callback<String> callback); 

Ich möchte den Rückgabewert auftreten, bevor der Rückruf aufgerufen wird. Ich schaute in die Verwendung von Mockito.doAnswer(..), aber scheint nicht herauszufinden, wie die Methode den Rückruf nach der Rückkehranweisung aufrufen aufrufen. Beispiel:

when(mockService.fetchString(any(Callback.class)).thenAnswer(
    new Answer<String>() { 
     String answer(InvocationOnMock invocation) { 
      ((Callback<String>) invocation.getArguments()[0]).onResult("callback string"); 
      return "return string"; 
     } 
    }); 

Wie Sie im obigen Beispiel sehen können, wird der Rückruf aufgerufen, bevor der Wert zurückgegeben wird. Asynchrone Callbacks werden nicht ordnungsgemäß getestet. Gibt es eine Möglichkeit, die Callback-Methode aufzurufen, nachdem der Wert zurückgegeben wurde?

Ich weiß, dass argumentCaptor hier verwendet werden kann, aber gibt es eine Alternative, die nicht manuell Callback aufrufen?

Etwas, das eine Kombination von doAnswer(..) und thenReturn(..) ist?

+1

Verwenden 'ArgumentCaptor' Instanz Rückruf zu erhalten und es aufrufen, wenn Sie es brauchen . – talex

+0

@Talex 'ArgumentCaptor' kann verwendet werden, aber nur nachdem die zu testende Methode aufgerufen wurde. Ich denke, er möchte diesen Callback aufrufen, während die zu testende Methode noch läuft. –

+0

Er ausdrücklich sagen "Callback-Methode aufgerufen werden, unmittelbar nachdem der Wert zurückgegeben wird". – talex

Antwort

1

Der beste Weg, dies zu erreichen, ist die Verwendung von ArgumentCaptor, wie von @taxex erwähnt.

So wie ich es verwendet wird:

Service-Methode:

String fetchString(Callback<String> callback); 

JUnit Test:

ArgumentCaptor<Callback> captor = ArgumentCaptor.forClass(Callback.class); 
when(mockService.fetchString(captor.capture()).thenReturn("return string"); 

String answer = mockService.fetchString(callbackToTest); 
// callback is invoked after the service method returned the value 
captor.getValue().onResult("callback string"); 

assertEquals("return string", answer); 
verify(callbackToTest).onResult(eq("callback string")); 
Verwandte Themen