Вопрос-ответ

Using Mockito with multiple calls to the same method with the same arguments

Использование 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 (...) { }
}
Переведено автоматически
Ответ 1

Как насчет

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

Вы можете поместить в скобки thenReturn столько аргументов, сколько захотите, при условии, что все они имеют правильный тип. Первое значение будет возвращено при первом вызове метода, затем при втором ответе и так далее. Последнее значение будет возвращаться повторно, как только будут израсходованы все остальные значения.

Ответ 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();
Ответ 3

Как указывалось ранее, почти все вызовы являются цепными.

Чтобы вы могли вызвать

when(mock.method()).thenReturn(foo).thenReturn(bar).thenThrow(new Exception("test"));

//OR if you're mocking a void method and/or using spy instead of mock

doReturn(foo).doReturn(bar).doThrow(new Exception("Test").when(mock).method();

Подробнее в документации Mockito.

Ответ 4

Почти все вызовы являются цепными:

doReturn(null).doReturn(anotherInstance).when(mock).method();
java