¿Hay alguna manera de que un método tropezado devuelva diferentes objetos en invocaciones posteriores? Me gustaría hacer esto para probar respuestas no determinadas de un ExecutorCompletionService. es decir, para probar que, independientemente del orden de devolución de los métodos, el resultado permanece constante.
El código que estoy buscando probar se parece a esto.
// 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 (...) { }
}

doAnswero escribir unAnsweren el caso que mencionas. Solo puedes usardoReturn(...).when(someSpy).someMethod(...). Parece razonable suponer que Emma está interesada en simulacros, en lugar de espías, pero creo que podría agregar algo a mi respuesta para explicar esto. Gracias por el comentario.Como se señaló anteriormente, casi todas las llamadas son encadenables.
Entonces puedes llamar
Más información en la Documentación de Mockito .
fuente
mock.methodse llamó en este ejemplo? Quiero algo así, volver a la primera vez pero volver a la barra para TODO el resto.Incluso puedes encadenar
doReturn()invocaciones de métodos como estalindo no es :)
fuente
Implementé una
MultipleAnswerclase que me ayuda a encontrar respuestas diferentes en cada llamada. Aquí el fragmento de código:fuente
Los siguientes pueden usarse como un método común para devolver diferentes argumentos en diferentes llamadas a métodos. Lo único que debemos hacer es pasar una matriz con el orden en el que se deben recuperar los objetos en cada llamada.
Ex.
getAnswerForSubsequentCalls(mock1, mock3, mock2);devolverá el objeto mock1 en la primera llamada, el objeto mock3 en la segunda llamada y el objeto mock2 en la tercera llamada. Debería usarse así.when(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2));Esto es casi similar awhen(something()).thenReturn(mock1, mock3, mock2);fuente
En relación con la respuesta de @ [Igor Nikolaev] de hace 8 años, el uso de un
Answerpuede simplificarse de alguna manera usando una expresión lambda disponible en Java 8.o más simplemente:
fuente
Estilo BDD:
fuente
fuente