Mocking Void Methods avec Mockito

1. Vue d'ensemble

Dans ce court didacticiel, nous nous concentrons sur la simulation des méthodes vides avec Mockito.

Comme avec d'autres articles axés sur le framework Mockito (tels que Mockito Verify, Mockito When / Then et Mockito's Mock Methods), la classe MyList ci-dessous sera utilisée comme collaborateur dans les cas de test.

Nous ajouterons une nouvelle méthode pour ce tutoriel:

public class MyList extends AbstractList { @Override public void add(int index, String element) { // no-op } }

2. Simulation et vérification simples

Void méthodes peuvent être utilisées avec des Mockito DoNothing () , doThrow () , et doAnswer () méthodes, ce qui rend moqueur et intuitive vérification:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); doNothing().when(myList).add(isA(Integer.class), isA(String.class)); myList.add(0, ""); verify(myList, times(1)).add(0, ""); }

Cependant, doNothing () est le comportement par défaut de Mockito pour les méthodes void .

Cette version de whenAddCalledVerified () accomplit la même chose que celle ci-dessus:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); myList(0, ""); verify(myList, times(1)).add(0, ""); } 

DoThrow () génère une exception:

@Test(expected = Exception.class) public void givenNull_AddThrows() { MyList myList = mock(MyList.class); doThrow().when(myList).add(isA(Integer.class), isNull()); myList.add(0, null); } 

Nous couvrirons doAnswer () ci-dessous.

3. Capture d'argument

Une des raisons de remplacer le comportement par défaut avec doNothing () est de capturer des arguments.

Dans l'exemple ci-dessus, nous avons utilisé la méthode verify () pour vérifier les arguments passés à add () .

Cependant, nous devrons peut-être capturer les arguments et faire quelque chose de plus avec eux.

Dans ces cas, nous utilisons doNothing () comme nous l'avons fait ci-dessus, mais avec un ArgumentCaptor :

@Test public void whenAddCalledValueCaptured() { MyList myList = mock(MyList.class); ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class); doNothing().when(myList).add(any(Integer.class), valueCapture.capture()); myList.add(0, "captured"); assertEquals("captured", valueCapture.getValue()); } 

4. Répondre à un appel pour annuler

Une méthode peut effectuer un comportement plus complexe que simplement ajouter ou définir une valeur.

Pour ces situations, nous pouvons utiliser la réponse de Mockito pour ajouter le comportement dont nous avons besoin:

@Test public void whenAddCalledAnswered() { MyList myList = mock(MyList.class); doAnswer(invocation -> { Object arg0 = invocation.getArgument(0); Object arg1 = invocation.getArgument(1); assertEquals(3, arg0); assertEquals("answer me", arg1); return null; }).when(myList).add(any(Integer.class), any(String.class)); myList.add(3, "answer me"); } 

Comme expliqué dans les fonctionnalités Java 8 de Mockito, nous utilisons un lambda avec Answer pour définir un comportement personnalisé pour add () .

5. Moquages ​​partiels

Les simulations partielles sont également une option. DoCallRealMethod () de Mockito peut être utilisé pour les méthodes void :

@Test public void whenAddCalledRealMethodCalled() { MyList myList = mock(MyList.class); doCallRealMethod().when(myList).add(any(Integer.class), any(String.class)); myList.add(1, "real"); verify(myList, times(1)).add(1, "real"); } 

De cette façon, nous pouvons appeler la méthode réelle et la vérifier en même temps.

6. Conclusion

Dans cet article bref, nous avons couvert quatre façons différentes d'aborder vides méthodes lors des tests avec Mockito.

Comme toujours, les exemples sont disponibles dans ce projet GitHub.