2
votes

Comment renvoyer des résultats différents lors de l'appel de la même méthode simulée?

J'ai une méthode que j'appelle qui se connecte à un autre serveur et à chaque fois que je l'appelle, et elle renvoie des données différentes.
J'écris un test unitaire pour la classe appelant la méthode. Je me suis moqué de cette classe et je m'attends à ce qu'elle renvoie le résultat tronqué. Cela fonctionne en fait avec doReturn , mais il renvoie les mêmes données à chaque fois. Je veux qu'il renvoie des données différentes et je veux être en mesure de spécifier ce que cela devrait être.

J'ai essayé d'utiliser 'doReturn - when' et cela fonctionne, mais je ne peux pas lui faire renvoyer un résultat différent. Je ne sais pas comment faire cela.

J'ai également essayé d'utiliser 'when - thenReturn' qui était la solution que j'ai trouvée ici sur StackOverflow. Avec cela, je pourrais spécifier o obtenir des réponses différentes chaque fois que j'appelle la même méthode.

Le problème est que j'obtiens une erreur de compilation

La méthode XXX n'est pas définie pour le type OngoingStubbing

JSONArray jsonArray1 = { json array1 here };
JSONArray jsonArray2 = { json array2 here };

// Works but return the same jsonArray1 every time:
MyClass MyClassMock = mock(MyClass.class);
Mockito.doReturn(jsonArray1)
        .when(MyClassMock).getMyValues(any(List.class), any   (String.class), any(String.class),
                any(String.class),
                any(String.class));

// Does not work:
when(MyClassMock).getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenReturn(jsonArray1, jsonArray2);


// Compile error:
// The method getMyValues(any(List.class), any(String.class), any (String.class), any(String.class), any(String.class)) is undefined for the type OngoingStubbing<MyClass>

J'obtiens une erreur de compilation:

La méthode getMyValues ​​(any (List.class), any (String.class), any (String.class), any (String.class), any (String.class)) n'est pas défini pour le type OngoingStubbing


0 commentaires

4 Réponses :


1
votes

Assurez-vous de mettre la maquette + sa méthode dans le when:

when(MyClassMock.getMyValues(any(List.class),
           any(String.class), any(String.class),
           any(String.class),
           any(String.class))
    .thenReturn(jsonArray1)
    .thenReturn(jsonArray2);


0 commentaires

1
votes

Tout d'abord, vous devez mettre la méthode simulée à l'intérieur du when:

when(MyClassMock.getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenAnswer(new Answer<JSONArray> {/*Add implementation here*/});

Aussi si vous voulez plus de contrôle sur ce qui est retourné (par exemple, en fonction des paramètres d'entrée de la méthode, vous devez utiliser un Répondez à la place de ne renvoyer que des valeurs.

Ce serait donc une meilleure solution, je pense:

when(MyClassMock.getMyValues(any(List.class),
       any(String.class), any(String.class),
       any(String.class),
       any(String.class)).thenReturn(...);

Peut-être ce message peut vous aider à utiliser la classe Answer de Mockito.


2 commentaires

Salut, merci à tous pour toutes les réponses. J'ai changé comme vous l'avez suggéré mais j'obtiens maintenant une erreur disant "La méthode thenReturn (JSONArray) n'est pas définie pour le type JSONArray" sur l'instruction .thenReturn. Je n'ai pas essayé la solution avec "new Answer " car je dois d'abord apprendre à utiliser Answer. De plus, je n'ai aucune implémentation. Je veux juste renvoyer un objet JSON. Meilleures salutations / Jan


Cela ressemble à ce que le compilateur attendait un type de retour différent de la méthode getMyValues ​​(...). Êtes-vous sûr d'utiliser le bon type de retour ici?



0
votes

Pour les simulations normales, vous pouvez utiliser quelque chose comme ceci:

doReturn(obj1).doReturn(obj2).when(this.client).someMethod();

Si vous utilisez spy () et doReturn () au lieu de la méthode when ():

ce dont vous avez besoin pour renvoyer un objet différent sur différents appels est le suivant:

when(mockFoo.someMethod())
            .thenReturn(obj1, obj2)
            .thenThrow(new RuntimeException("Fail"));


0 commentaires

0
votes

Cette dernière suggestion a fonctionné!

Mockito.doReturn (obj1) .doReturn (obj2) .when (this.client) .someMethod ();

Merci à tous pour votre aide! / Janv


0 commentaires