Bien comprendre le stubbing de Mockito
Bonjour cher tous,
Nous allons voir ensemble comment éviter quelques erreurs lors de l'utilisation du stubbing when de Mockito dans la mise en place de nos tests unitaires ou d'intégrations.
Qu'est ce que Mockito ?
Mockito est un framework open source de test en Java.
Il permet de donner des comportements fake à nos objets dans les pratiques TDD ou BDD.
Nous n'allons pas expliquer ces deux thèmes dans cet article. Vous pouvez les voir plus tard.
J'ai découvert il y'a quelques années une subtilité dans les tests avec Mockito an utilisant le stubbing when.
Lorsque nous voulons un comportement lors de l'exécution de nos méthodes les types d'argument utilisés sont très importants.
Dans cet article nous allons voir 1 type d'argument parmi l'ensemble fournit dans le package org.mockito.ArgumentMacthers qui pourrait être une source d'erreurs dans nos tests.
Notons que si ne voulons pas utiliser le type de nos arguments, l'utilisation du sutbbing any ne produira pas d'erreurs.
Supposons dans ce test que nous avons une méthode convertToUppercase(String param) dans une classe de MySecondService.
Cette méthode prend une chaîne de caractère et la transforme en majuscule et peut retourner une erreur si la chaîne de caractère n'est pas renseignée.
La classe MySecondService est utilisé dans une autre classe MyFirstService avec une méthode nommée convert(String param);
Un exemple de la représentation sera :
...
private MySecondService mySecondService = new MySecondService();
public String covert(String param){
...
String upperCaseValue = mySecondService.convertToUppercase(param);
....
}
Supposons que nous voulons valider le cas nominal de cette méthode.
Les exemples de test sont basés sur Junit 5 et Mockito 4.
Un exemple de mock sera when(mySecondService.convertToUppercase(anyString())).thenReturn("TEST");
Supposons maintenant que nous voulons léver une exception lorsque mySecondService.convertToUppercase(param) est invoquée.
Le mock pourra être
when(mySecondService.convertToUppercase(anyString())).thenThrow(NullPointerException.class);
Que se passe t-il si nous invoquons myFirstService.convert :
- Si nous faisons le test avec myFirstService.convert("test"), il fonctionnera;
- Si nous le faisons avec myFirstService.convert(null), le test ne fonctionnera pas.
Comments
Post a Comment