使用 Mockito 多次调用具有相同参数的相同方法

新手上路,请多包涵

有没有办法让存根方法在后续调用中返回不同的对象?我想这样做来测试来自 ExecutorCompletionService 的不确定响应。即测试无论方法的返回顺序如何,结果都保持不变。

我要测试的代码看起来像这样。

 // Create an completion service so we can group these tasks together
ExecutorCompletionService<T> completionService =
        new ExecutorCompletionService<T>(service);

// Add all these tasks to the completion service
for (Callable<T> t : ts)
    completionService.submit(request);

// As an when each call finished, add it to the response set.
for (int i = 0; i < calls.size(); i ++) {
    try {
        T t = completionService.take().get();
        // do some stuff that I want to test
    } catch (...) { }
}

原文由 Emma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

您可以使用 thenAnswer 方法(与 when 链接时):

 when(someMock.someMethod()).thenAnswer(new Answer() {
    private int count = 0;

    public Object answer(InvocationOnMock invocation) {
        if (count++ == 1)
            return 1;

        return 2;
    }
});

或者使用等效的静态 doAnswer 方法:

 doAnswer(new Answer() {
    private int count = 0;

    public Object answer(InvocationOnMock invocation) {
        if (count++ == 1)
            return 1;

        return 2;
    }
}).when(someMock).someMethod();

原文由 Igor Nikolaev 发布,翻译遵循 CC BY-SA 3.0 许可协议

怎么样

when( method-call ).thenReturn( value1, value2, value3 );

您可以在 thenReturn 的括号中放入任意数量的参数,前提是它们都是正确的类型。第一次调用该方法时将返回第一个值,然后是第二个答案,依此类推。一旦所有其他值都用完,将重复返回最后一个值。

原文由 Dawood ibn Kareem 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题