2017-07-28 64 views
2

在的Mockito,我需要模擬返回一些值的方法,也有調用回調的Mockito:模擬與回調方法都返回值

例如,這裏是服務方法:

String fetchString(Callback<String> callback); 

我希望返回值在調用回調之前發生。我看着使用Mockito.doAnswer(..),但似乎無法弄清楚如何使該方法在return語句後調用回調。例如:

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"; 
     } 
    }); 

正如您在上面的示例中看到的:在返回值之前調用回調。這不會正確測試異步回調。有沒有辦法在返回值後調用回調方法?

我知道argumentCaptor這裏可以使用,但有不涉及手動調用回調的方法嗎?

的東西,是的doAnswer(..)thenReturn(..)組合?

+1

使用'ArgumentCaptor'獲得回調的情況下,當你需要它調用它。 – talex

+0

@Talex'ArgumentCaptor'可以被使用,但只有在被調用的方法被調用之後。我認爲他希望在被測方法仍在運行時調用該回調。 –

+0

他特別聲明「返回值後立即調用回調方法」。 – talex

回答

1

實現這一目標的最好方法是使用ArgumentCaptor,由@talex提及。

我用它的方式是:

服務方法:

String fetchString(Callback<String> callback); 

JUnit測試:

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"));