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 List
renvoie 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.
GO TO FULL VERSION