4.1 Paramètres de la méthode

Les règles précédentes ajoutées à l'objet fictif traitaient des méthodes sans paramètres. Et comment créer des règles pour les méthodes avec des paramètres ? De plus, je voudrais créer des règles pour que pour certaines valeurs de paramètres il y ait un résultat, et pour d'autres - un autre.

C'est ainsi que vous pouvez le faire aussi. Si vous voulez que la méthode retourne quelque chose de spécifique avec un certain paramètre, alors la règle peut être écrite comme ceci :

Mockito.doReturn(result).when(an object).method name(parameter);

Prenons un exemple pour mieux comprendre. Laissez notre liste renvoyer le nom Ivan lors de la demande du 10e élément et le nom Marya lors de la demande du 500e. À peine dit que c'était fait.

@ExtendWith(MockitoExtension.class)
class ParamsTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //adding the first rule
        Mockito.doReturn("Ivan").when(mockList).get(10);
        //adding a second rule
        Mockito.doReturn("Maria").when(mockList).get(500);

        assertEquals("Ivan", mockList.get(10));
        assertEquals("Maria", mockList.get(500));

    }
}

4.2 Modèles de paramètres

Et immédiatement des collègues rusés me poseront la question: "Et si la méthode nécessite des arguments, mais pour toutes les valeurs, elle doit renvoyer le même résultat?". N'écrivons pas :

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

Non, personne ne vous oblige à écrire comme ça. Si vous souhaitez ajouter une règle à un objet fictif qui fonctionne pour une méthode avec n'importe quel argument, alors il existe un objet spécial pour cela :

Mockito.any()

Notre exemple avec cela s'écrirait comme ceci :

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

Il y a quelques nuances ici. L'objet Mockito.any()a le type Object, il existe donc des analogues pour les paramètres de différents types :

Méthode Type de paramètre
1 n'importe quel() Objet incluant null
2 tout(ClassName.class) nom du cours
3 anyInt() entier
4 anyBoolean() booléen
5 toutDouble() double
6 n'importe quelle liste() Liste

Plus correctement, notre exemple ressemblerait à ceci :

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 Méthode doAnswer()

Nous sommes arrivés au comportement complexe des méthodes virtuelles. Tôt ou tard, il y aura une situation où vous voudrez que cette méthode virtuelle ait un comportement complexe. Par exemple, il doit renvoyer des valeurs en fonction des paramètres, convertir la chaîne en majuscule.

Il existe une méthode spéciale pour cela - doAnswer(), à laquelle est transmise une fonction qui fait ce dont vous avez besoin :

Mockito.doAnswer(function).when(an object).method name(parameter);

Faisons en sorte que la méthode get()de classe Listrenvoie le carré de l'argument qui lui est passé. Et écrivez le programme suivant :

@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.doAnswer(invocation -> {
            int parameter = invocation.getArgument(0);
            return parameter * parameter;
        }).when(mockList).get(anyInt());

        assertEquals(100, mockList.get(10));
        assertEquals(25, mockList.get(5));
    }
}

Nous avons défini la fonction en utilisant un objet de la classe Answer.