Introduction à Mockito§

Département Informatique, IUT Lyon 1

Creative Commons License

Ce travail est sous licence Creative Commons Attribution-ShareAlike 3.0 France.

Introduction à Mockito§

Contexte§

Contexte - Problème§

Lorsque l’on écrit des tests, il nous manque parfois des éléments :

  • Objets inaccessibles
  • Situations difficiles à simuler
  • ...
Par ailleurs, quand on fait du test unitaire, on veut éviter au
maximum les effets de bords (dysfonctionnements des autres objets)

Principe de Mockito : simuler les objets “manquants” !

Que fait Mockito ?§

Mockito crée des simulacres à partir de n’importe quelle classe ou interface.

Mockito permet de controler le comportement des méthodes, c’est le stubbing

Dans quelles situations l’utiliser ?§

  • Pour des objets au comportement “non-déterministe” (horloge, capteur)
  • Pour simuler des sources externes (BD, serveurs)
  • Pour simuler des objets pas encore implémentés
  • Pour créer des situations difficiles à reproduire (erreurs, exceptions)
  • Pour espionner les appels à des objets bien réels

Quelles sont les fonctionnalités de Mockito ?§

Simuler :

  • Accepter un argument
  • Accepter un ensemble d’arguments
  • Lever une exception

Vérifier, espionner :

  • Vérifier le nombre d’appels d’une méthode (atLeast, atMost)
  • Vérifier l’ordre dans lequel ont été faits les appels

Vocabulaire§

  • dummy : objet vide... jamais utilisé et dont les méthodes ne sont jamais appelées (remplissage)
  • fake : objet avec une implémentation valide mais simplifiée (image d’une BD par exemple)
  • stub : implémentation partielle pour les besoins du test (retourne des valeurs lors de l’invocation d’une méthode)
  • spy : classe qui vérifie l’utilisation qui en est faite à la fin de l’exécution
  • mock : dummy implementation... dont on peut maîtriser le comportement

Utilisation de Mockito§

Création des mocks§

La création des Mocks se fait soit en utilisant la méthode static mock(), soit en utilisant l’annotation @Mock

Dans le cas de l’annotation les objets doivent être initialisés avec MockitoAnnotations.initMocks(this)

import static org.mockito.Mockito.*;
List mockedList = mock(List.class);

Gestion du comportement - Stubbing§

Méthode when

Spécifier une condition et retourner la valeur pour cette condition

  • Retour de valeur unique
  • Retour de valeurs consécutives
  • Levée d’exceptions
when(mockedList.get(0)).thenReturn("toto");
when(mockedList.get(anyInt())).thenReturn("toto");

Vérifications en fin de test§

Méthode verify

  • Un seul appel
  • Au moins / au plus une fois
  • Jamais appelée
  • Appelée avec des paramètres spécifiques

Mockito conserve une trace des appels aux méthodes des Mocks.

Warning

C’est du test de comportement : on s’assure que la méthode est appelée avec les bons paramètres, et non que le résultat est bon.

Espionnage§

Méthode spy

Cette méthode permet d’encapsuler un objet qui existe vraiment.

Matchers§

Pour utiliser un ensemble de paramètres

Si on utilise des matchers, tous les arguments de la méthode doivent être des matchers !

Pour aller plus loin§

Limitations de Mockito§

Mockito ne gère pas :

  • Les classes finales
  • Les méthodes statiques
  • Les classes anonymes
  • Les types primitifs
  • Les méthodes equals() et hashCode()

Alternatives à Mockito§

  • jMock

http://jmock.org/

  • EasyMock

http://easymock.org/

Exercice : simulation de traitements sur une BD§

Exercice§

L’objectif de l’exercice est de mettre en application les différentes fonctionnalités de Mockito pour simuler le comportement d’un connecteur de bases de donnée.

On considérera que la base contient des clients et des factures.

La correction de l’exercice se fera de façon interactive et collective, au tableau (projection).