Usando Mockito con múltiples llamadas al mismo método con los mismos argumentos

Resuelto Emma asked hace 13 años • 14 respuestas

¿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 (...) { }        
}
Emma avatar Nov 11 '11 07:11 Emma
Aceptado

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.

Dawood ibn Kareem avatar Dec 06 '2011 05:12 Dawood ibn Kareem

Puedes hacerlo usando el thenAnswermé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;
    }
});

doAnswerO 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();
Igor Nikolaev avatar Nov 11 '2011 00:11 Igor Nikolaev

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 .

Raystorm avatar Nov 13 '2015 17:11 Raystorm

Casi todas las llamadas se pueden encadenar:

doReturn(null).doReturn(anotherInstance).when(mock).method();
Volodymyr Kozubal avatar May 13 '2015 15:05 Volodymyr Kozubal