431 votes

Utiliser Mockito avec plusieurs appels de la même méthode avec les mêmes arguments

Existe-t-il un moyen pour une méthode stubbed de renvoyer différents objets lors d'invocations ultérieures? Je voudrais faire ceci pour tester les réponses non déterminées d'un ExecutorCompletionService . c'est-à-dire pour tester que, quel que soit l'ordre de retour des méthodes, le résultat reste constant.

Le code que je cherche à tester ressemble à ceci.

 // 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 (...) { }        
}
 

858voto

David Wallace Points 23911

Que diriez-vous

 when( method-call ).thenReturn( value1, value2, value3 );
 

Vous pouvez mettre autant d'arguments que vous le souhaitez dans les crochets de thenReturn, à condition qu'ils soient tous du type correct. La première valeur sera renvoyée la première fois que la méthode est appelée, puis la deuxième réponse, etc. La dernière valeur sera renvoyée à plusieurs reprises une fois que toutes les autres valeurs sont épuisées.

323voto

Igor Nikolaev Points 702

Vous pouvez le faire en utilisant la méthode doAnswer:

 someMock.doAnswer(new Answer() {
    private int count = 0;

    public Object answer(InvocationOnMock invocation) {
        if (count++ == 1)
            return 1;

        return 2;
    }
});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X