Mockito - Utiliser des espions

Mockito - Utiliser des espions

1. Vue d'ensemble

Dans ce didacticiel, nous allons illustrer comment tirer le meilleur parti despies in Mockito.

Nous parlerons de l'annotation@Spy, de la façon de stuber un espion et, enfin - nous entrerons dans la différence entreMock etSpy.

Et bien sûr, pour plus de bonté Mockito,have a look at the series here.

Lectures complémentaires:

Mockito Vérifier le livre de recettes

Exemples, utilisation et bonnes pratiques deMockito Verify.

Read more

Injecter Mockito se moque des haricots de printemps

Cet article expliquera comment utiliser l’injection de dépendance pour insérer des prototypes Mockito dans Spring Beans à des fins de test unitaire.

Read more

Mockito Mock Méthodes

Ce tutoriel illustre diverses utilisations des méthodes statiques factices standard de l'API Mockito.

Read more

2. Exemple deSpy simple

Commençons par un exemple simple dehow to use a spy.

En termes simples, l'API estMockito.spy() - tospy on a real object.

Cela nous permettra d'appeler toutes les méthodes normales de l'objet tout en suivant chaque interaction, comme nous le ferions avec une maquette.

OK, faisons un exemple rapide où nous allons espionner un objetArrayList existant:

@Test
public void whenSpyingOnList_thenCorrect() {
    List list = new ArrayList();
    List spyList = Mockito.spy(list);

    spyList.add("one");
    spyList.add("two");

    Mockito.verify(spyList).add("one");
    Mockito.verify(spyList).add("two");

    assertEquals(2, spyList.size());
}

Notez commentthe real method add() is actually called et comment la taille despyList devient 2.

3. L'annotation@Spy

Ensuite, voyons comment utiliser l'annotation@Spy. Nous pouvons utiliser l'annotation@Spy au lieu despy() comme dans l'exemple suivant:

@Spy
List spyList = new ArrayList();

@Test
public void whenUsingTheSpyAnnotation_thenObjectIsSpied() {
    spyList.add("one");
    spyList.add("two");

    Mockito.verify(spyList).add("one");
    Mockito.verify(spyList).add("two");

    assertEquals(2, spyList.size());
}

Pourenable Mockito annotation (comme@Spy,@Mock,…) - nous devons faire l'une des choses suivantes:

  • Appelez la méthodeMockitoAnnotations.initMocks(this) pour initialiser les champs annotés

  • Utilisez le runner intégré@RunWith(MockitoJUnitRunner.class)

4. Stubbing aSpy

Maintenant - Voyons comment stuber unSpy. Nous pouvons configurer / remplacer le comportement d'une méthode en utilisant la même syntaxe que celle que nous utiliserions avec un modèle.

Dans l'exemple suivant, nous utilisonsdoReturn() pour remplacer la méthodesize():

@Test
public void whenStubASpy_thenStubbed() {
    List list = new ArrayList();
    List spyList = Mockito.spy(list);

    assertEquals(0, spyList.size());

    Mockito.doReturn(100).when(spyList).size();
    assertEquals(100, spyList.size());
}

5. Mock contre Spy in Mockito

Maintenant - parlons de la différence entreMock etSpy dans Mockito - pas les différences théoriques entre les deux concepts, juste comment ils diffèrent dans Mockito lui-même.

Lorsque Mockito crée une maquette - il le fait à partir desClass d'un Type, et non d'une instance réelle. La simulation crée simplementa bare-bones shell instance de la classe, entièrement instrumentés pour suivre les interactions avec elle.

D'autre part,the spy will wrap an existing instance. Il se comportera toujours de la même manière que l'instance normale - la seule différence est qu'il sera également instrumenté pour suivre toutes les interactions avec lui.

Dans l'exemple suivant - nous créons unmock de la classeArrayList:

@Test
public void whenCreateMock_thenCreated() {
    List mockedList = Mockito.mock(ArrayList.class);

    mockedList.add("one");
    Mockito.verify(mockedList).add("one");

    assertEquals(0, mockedList.size());
}

Comme nous pouvons le voir - l'ajout d'un élément dans la liste simulée n'ajoute en fait rien - il appelle simplement la méthode sans autre effet secondaire.

Un espion, par contre, se comportera différemment - il appellera en fait l'implémentation réelle de la méthodeadd et ajoutera l'élément à la liste sous-jacente:

@Test
public void whenCreateSpy_thenCreate() {
    List spyList = Mockito.spy(new ArrayList());

    spyList.add("one");
    Mockito.verify(spyList).add("one");

    assertEquals(1, spyList.size());
}

6. Comprendre les MockitoNotAMockException

Dans cette dernière section, nous découvrirons les MockitoNotAMockException. This exception is one of the common exceptions we will likely encounter when misusing mocks or spies.

Commençons par voir dans quelles circonstances cette exception peut se produire:

List list = new ArrayList();
Mockito.doReturn(100).when(list).size();

assertEquals("Size should be 100: ", 100, list.size());

Lorsque nous exécutons cet extrait de code, nous obtenons l'erreur suivante:

org.mockito.exceptions.misusing.NotAMockException:
Argument passed to when() is not a mock!
Example of correct stubbing:
    doThrow(new RuntimeException()).when(mock).someMethod();

Heureusement, le message d'erreur Mockito indique clairement le problème. Dans notre exemple, l'objetlist n'est pas un simulacre. The Mockito when() method expects a mock or spy object as the argument.

Comme nous pouvons également le constater, le message Exception décrit même à quoi une invocation correcte devrait ressembler. Maintenant que nous avons une meilleure compréhension de la nature du problème, résolvons-le en suivant la recommandation:

final List spyList = Mockito.spy(new ArrayList());
Mockito.doReturn(100).when(spyList).size();

assertEquals("Size should be 100: ", 100, spyList.size());

Notre exemple se comporte désormais comme prévu et nous ne voyons plus les MockitoNotAMockException.

7. Conclusion

Dans cet article rapide, nous avons présenté les exemples les plus utiles d'utilisation des espions Mockito.

Nous avons appris comment créer unspy, comment utiliser l'annotation@Spy, comment stuber unspy et, enfin - la différence entreMock etSpy.

L'implémentation de tous ces exemplescan be found over on GitHub.

Ceci est un projet Maven, il devrait donc être facile à importer et à exécuter tel quel.

Et bien sûr, pour plus de bonté Mockito,have a look at the series here.