¿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 (...) { }
}
doAnswer
o escribir unAnswer
en 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.method
se 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
MultipleAnswer
clase 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
Answer
puede simplificarse de alguna manera usando una expresión lambda disponible en Java 8.o más simplemente:
fuente
Estilo BDD:
fuente
fuente