3.1 Méthode doReturn()
Maintenant vient la magie...
Disons que vous avez créé un faux objet fictif, mais que vous en avez besoin pour fonctionner d'une manière ou d'une autre. Lorsque certaines méthodes ont été appelées, quelque chose d'important a été fait ou les méthodes ont renvoyé un certain résultat. Ce qu'il faut faire?
La bibliothèque Mockito vous permet d'ajouter le comportement souhaité à un objet fictif.
Si vous souhaitez qu'un objet fictif renvoie un certain résultat lorsqu'une certaine méthode est appelée, cette "règle" peut être ajoutée à l'objet à l'aide du code :
Mockito.doReturn(result).when(an object).method name();
Vous voyez, à la fin de l'appel de méthode, method name?
il n'y a en fait aucun appel en cours ici. La méthode doReturn()
renvoie un objet proxy spécial à l'aide duquel elle surveille les appels des méthodes de l'objet et, ainsi, la règle est écrite.
Encore. C'est juste une façon tellement intelligente d'écrire une règle à ajouter à un objet fictif . Il faut une certaine habileté pour interpréter correctement un tel code dans votre tête lorsque vous le voyez. Vient avec l'expérience.
Je pense qu'il faut un exemple concret. Créons un objet de classe fictif ArrayList
et demandons à sa méthode size()
de renvoyer le nombre 10. Le code complet ressemblera à ceci :
@ExtendWith(MockitoExtension.class)
class DoReturnTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation () {
//create a rule: return 10 when calling the size method
Mockito.doReturn(10).when(mockList).size();
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
Oui, ce code fonctionnera, le test n'échouera pas.
3.2 méthode when()
Il existe un autre moyen d'ajouter une règle de comportement à un objet factice - en appelant le Mockito.when()
. Il ressemble à ceci :
Mockito.when(an object.method name()).thenReturn(result);
C'est la même façon d'écrire une règle de comportement d'objet fictif que la précédente. Comparer:
Mockito.doReturn(result).when(an object).method name();
Ici, exactement la même chose se produit - la construction d'une nouvelle règle.
Certes, le premier exemple a deux inconvénients:
- l'appel est très déroutant.
an object.method name()
- ne fonctionnera pas si la méthode
methodname()
retournevoid
.
Eh bien, écrivons notre exemple préféré en utilisantMockito.when()
@ExtendWith(MockitoExtension.class)
class WhenTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//create a rule: return 10 when calling the size method
Mockito.when(mockList.size() ).thenReturn(10);
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
3.3 Méthode doThrow()
Nous avons compris comment faire en sorte qu'une méthode d'objet fictif renvoie un résultat spécifique. Comment puis-je lui faire lancer une exception spécifique? Envoyez-le à doReturn()
?
Pour empêcher la méthode de revenir, c'est-à-dire de lancer une exception, vous devez définir la règle à l'aide de doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
Et puis la deuxième option :
Mockito.when(an object.method name()).thenThrow(exception.class);
Un peu attendu, non ?
Eh bien, vous voyez, vous commencez déjà à comprendre. Réparons-le avec un exemple :
@ExtendWith(MockitoExtension.class)
class DoThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
mockList.size(); //an exception will be thrown here
}
}
Si vous devez lancer un objet d'exception spécifique, utilisez la construction du formulaire :
Mockito.doThrow(new Exception()).when(an object).method name();
Passez simplement doThrow()
un objet exception à la méthode et il sera lancé lors de l'appel de la méthode.