Usando Mockito con múltiples llamadas al mismo método con los mismos argumentos
¿Hay alguna manera de que un método fragmentado devuelva diferentes objetos en invocaciones posteriores? Me gustaría hacer esto para probar respuestas no determinadas de un archivo ExecutorCompletionService
. es decir, probar que, independientemente del orden de retorno 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 (...) { }
}
Qué tal si
when( method-call ).thenReturn( value1, value2, value3 );
Puedes poner tantos argumentos como quieras entre corchetes de thenReturn, siempre que sean del tipo correcto. El primer valor se devolverá la primera vez que se llame al método, luego la segunda respuesta, y así sucesivamente. El último valor se devolverá repetidamente una vez que se agoten todos los demás valores.
Puedes hacerlo usando el thenAnswer
método (al encadenar con when
):
when(someMock.someMethod()).thenAnswer(new Answer() {
private int count = 0;
public Object answer(InvocationOnMock invocation) {
if (count++ == 1)
return 1;
return 2;
}
});
doAnswer
O usando el método estático equivalente :
doAnswer(new Answer() {
private int count = 0;
public Object answer(InvocationOnMock invocation) {
if (count++ == 1)
return 1;
return 2;
}
}).when(someMock).someMethod();
Como se señaló anteriormente, casi todas las llamadas se pueden encadenar.
Entonces podrías llamar
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();
Más información en la Documentación de Mockito .
Casi todas las llamadas se pueden encadenar:
doReturn(null).doReturn(anotherInstance).when(mock).method();