Existe uma maneira de um método stubbed retornar objetos diferentes nas invocações subseqüentes? Eu gostaria de fazer isso para testar respostas não determinadas de um ExecutorCompletionService
. isto é, para testar se, independentemente da ordem de retorno dos métodos, o resultado permanece constante.
O código que estou procurando testar é mais ou menos assim.
// 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
ou deve escrever umAnswer
no caso mencionado. Você pode apenas usardoReturn(...).when(someSpy).someMethod(...)
. Parece razoável supor que Emma esteja interessada em zombarias, em vez de espiões, mas acho que poderia acrescentar algo à minha resposta para explicar isso. Obrigado pelo comentário.Como apontado anteriormente, quase todas as chamadas são encadeadas.
Então você poderia ligar
Mais informações em Documenation de Mockito .
fonte
mock.method
foi chamado neste exemplo? Eu quero algo como, retornar foo pela primeira vez, mas retornar barra para todo o resto.Você pode até encadear
doReturn()
invocações de métodos como estafofo não é :)
fonte
Eu implementei uma
MultipleAnswer
classe que me ajuda a esboçar respostas diferentes em cada chamada. Aqui o trecho de código:fonte
A seguir, pode ser usado como um método comum para retornar argumentos diferentes em diferentes chamadas de método. A única coisa que precisamos fazer é passar uma matriz com a ordem na qual os objetos devem ser recuperados em cada chamada.
Ex.
getAnswerForSubsequentCalls(mock1, mock3, mock2);
retornará o objeto mock1 na primeira chamada, o objeto mock3 na segunda chamada e o objeto mock2 na terceira chamada. Deve ser usado comowhen(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2));
Este é quase semelhante aowhen(something()).thenReturn(mock1, mock3, mock2);
fonte
Relacionadas com @ [Igor Nikolaev] resposta 's a partir de 8 anos atrás, usando um
Answer
pode ser simplificado um pouco usando uma expressão lambda disponível em Java 8.ou mais simplesmente:
fonte
Estilo BDD:
fonte
fonte