Есть ли способ заставить заглушенный метод возвращать разные объекты при последующих вызовах? Я хотел бы сделать это, чтобы проверить неопределенные ответы от 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 (...) { }
}
doAnswer
или написатьAnswer
в случае, что вы упоминаете. Вы можете просто использоватьdoReturn(...).when(someSpy).someMethod(...)
. Кажется разумным предположить, что Эмма интересуется насмешками, а не шпионами, но я думаю, я мог бы добавить кое-что к своему ответу, чтобы объяснить это. Спасибо за комментарий.Как указывалось ранее, почти все звонки являются связными.
Чтобы вы могли позвонить
Больше информации в Документации Мокито .
источник
mock.method
был назван в этом примере? Я хочу что-то вроде, вернуть foo в первый раз, но вернуть бар для всех остальных.Вы даже можете связать
doReturn()
вызовы методов, как этомило не так ли :)
источник
Я реализовал
MultipleAnswer
класс, который помогает мне заглушать разные ответы при каждом вызове. Вот кусок кода:источник
Следующее может использоваться как общий метод для возврата различных аргументов при разных вызовах методов. Единственное, что нам нужно сделать, - это передать массив с порядком, в котором объекты должны извлекаться при каждом вызове.
Ex.
getAnswerForSubsequentCalls(mock1, mock3, mock2);
вернет объект mock1 при первом вызове, объект mock3 при втором вызове и объект mock2 при третьем вызове. Должен использоваться какwhen(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2));
Это почти похоже наwhen(something()).thenReturn(mock1, mock3, mock2);
источник
Относительно ответа @ [Igor Nikolaev] от 8 лет назад, использование an
Answer
может быть несколько упрощено с помощью лямбда-выражения, доступного в Java 8.или проще:
источник
BDD стиль:
источник
источник