Préambule
- Télécharger mockito
- Ajouter à votre projet actuel le jar téléchargé précédemment
Premier mock
- Créer un nouvel classe de test
- Ajouter l'import suivant pour faciliter l'écriture des tests en utilisant mockito et augmenter la lisibilité de votre code
import static org.mockito.Mockito.*;
- Pour créer des objets mock (sans état interne, mais disposant d'une implémentation avec valeurs par défaut de chaque méthode) de type stub utilisez l'écriture suivante :
Money money_stub=mock(Money.class);
- Pour créer associer à des objets existant des objets de type spy, permettant de surveiller et éventuellement modifier leur comportement, utilisez l'écriture suivante :
Money real_money=new Money(10,"EUR");
Money money_spy=spy(real_money);
- Afin de changer le comportement des objets associés à des spy ou imposer un comportement spécifique à des stub vous pouvez utiliser la notation suivante :
when(money_spy.getValue()).thenReturn(1); //lors d'un appel sur getValue, la méthode réeele s'exécute sur l'objet, mais la valeur 1 est renvoyée
when(money_stub.getValue()).thenReturn(1); //lors d'un appel sur getValue, la valeur 1 est retournée tout de suite
//ou
doReturn(1).when(money_spy).getValue() //lors d'un appel sur getValue, la valeur 1 est retournée tout de suite
doReturn(1).when(money_stub).getValue(); //lors d'un appel sur getValue, la valeur 1 est retournée tout de suite
- Afin de vérifier que telle ou telle méthode d'un objet a été appelée pendant l’exécution d'un bout de code, nous pouvons utiliser des codes similaires à celui ci-dessous. Attention, verify ne valide pas le résultat obtenu suite à l'appel, mais valide le fait que pendant l'appel telle ou telle méthode a été appelée un certain nombre de fois (times), ou dans un certain ordre (inOrder).
import org.mockito.InOrder;
...
Money m1EURs=spy(new Money(1,"EUR"));
m1EURs._equals(m1EURs);
verify(m1EURs,times(2)).getValue(); //deux fois car le même objet comparé à lui même
---------
Money m1EUR=spy(new Money(1,"EUR"));
m1EURs.toString();
verify(m1EURs).getValue(); //deux fois car le même objet comparé à lui même
---------
Money m1EURs=spy(new Money(1,"EUR")); ...
Money m2EURs=spy(new Money(2,"EUR"));
m1EURs._equals(m2EURs);
InOrder inOrder=inOrder(m1EURs,m2EURs);
inOrder.verify(m1EURs).getValue();
inOrder.verify(m2EURs).getValue();
inOrder.verify(m1EURs).getCurrency();
inOrder.verify(m2EURs).getCurrency();
= Exercices
- Re-écrire où necessaire les tests déjà réalisés sur votre projet afin d'isoler au maximum les comportements testés
- Tests sur Money.equals
- Tests sur MoneyOps.add / MoneyOps.sub avec gestion d'exceptions (pas même devise, opération impossible)
- Tests sur MoneyFactory avec gestion d'exception (devise non enregistrée, valeur inférieure à zéro)