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 :

  1. Si nous faisons le test avec myFirstService.convert("test"), il fonctionnera;
  2. Si nous le faisons avec myFirstService.convert(null), le test ne fonctionnera pas.
Le deuxième cas de test ne fonctionne pas parce que nous avons fait notre mock avec anyString()
et que Mockito ne reconnaît pas la valeur nulle comme une chaîne de caractère valide lors de l'appel de 
mySecondService.convertToUppercase(null).

Toutefois il fonctionnera si nous utilisons any().



Bonne lecture.
Patrick



Comments

Popular posts from this blog

Apprendre le framework de Java (Spring Boot, 1ère partie)

Apprendre le framework de Java (Spring Boot, 2ème partie)

Apprendre le framework de Python (Flask 1ère partie )