Mockito:使用回调方法模拟返回值

4
在mockito中,我希望模拟一个同时返回值并调用回调方法的方法。
例如,以下是服务方法:
String fetchString(Callback<String> callback);

我希望在调用回调函数之前返回值。我研究了如何使用Mockito.doAnswer(..),但似乎无法想出如何使方法在返回语句之后调用回调函数。示例:

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
@Talex 可以使用 ArgumentCaptor,但只能在测试方法被调用后使用。我认为他想在测试方法仍在运行时调用回调函数。 - Maciej Kowalski
他明确表示:“回调方法将在值返回后立即被调用”。 - talex
1
请问您能描述一下您的使用情况吗?之后您会如何处理回调函数呢? - Morfic
编辑后的文本:回调函数不需要立即被调用,但是它需要在值返回后被调用。 - Prem
显示剩余3条评论
1个回答

2

最好的实现方法是使用 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"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接