是否有一种方法可以让存根方法在后续调用时返回不同的对象?我希望这样做是为了测试来自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 (...) { }        
}

当前回答

与8年前@[Igor Nikolaev]的答案相关,使用Java 8中的lambda表达式可以在一定程度上简化answer的使用。

when(someMock.someMethod()).thenAnswer(invocation -> {
    doStuff();
    return;
});

或者更简单地说:

when(someMock.someMethod()).thenAnswer(invocation -> doStuff());

其他回答

这和问题没有直接关系。但我想把这个放在同一个链上。

如果试图用多个参数验证同一个方法调用,可以使用Mockito的下面的times特性。如果你不验证,你就不需要它。

5。验证((n)方法,倍).methoscall ();

这里的“n”是调用mock的次数。

我已经实现了一个MultipleAnswer类,它可以帮助我在每个调用中存根不同的答案。下面是一段代码:

private final class MultipleAnswer<T> implements Answer<T> {

    private final ArrayList<Answer<T>> mAnswers;

    MultipleAnswer(Answer<T>... answer) {
        mAnswers = new ArrayList<>();
        mAnswers.addAll(Arrays.asList(answer));
    }

    @Override
    public T answer(InvocationOnMock invocation) throws Throwable {
        return mAnswers.remove(0).answer(invocation);
    }
}

如何

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

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

这里是BDD风格的工作示例,非常简单和清晰

given(carRepository.findByName(any(String.class))).willReturn(Optional.empty()).willReturn(Optional.of(MockData.createCarEntity()));

你可以使用LinkedList和Answer。如

MyService mock = mock(MyService.class);
LinkedList<String> results = new LinkedList<>(List.of("A", "B", "C"));
when(mock.doSomething(any())).thenAnswer(invocation -> results.removeFirst());