Se moquer des méthodes de vide avec Mockito

Se moquer des méthodes de vide avec Mockito

1. Vue d'ensemble

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

Lectures complémentaires:

Fonctionnalités Java 8 de Mockito

Présentation de la prise en charge de Java 8 dans la structure Mockito, y compris les méthodes de flux et les interfaces par défaut

Read more

Exception moqueuse Lancer à l'aide de Mockito

Apprenez à configurer un appel de méthode pour générer une exception dans Mockito.

Read more

Comme pour d'autres articles axés sur le framework Mockito (commeMockito Verify,Mockito When/Then etMockito’s Mock Methods), la classeMyList ci-dessous sera utilisée comme collaborateur dans les cas de test. Nous allons ajouter 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

Les méthodesVoid peuvent être utilisées avec les méthodesdoNothing(), doThrow(), and doAnswer() de Mockito, ce qui permet de se moquer et de vérifier intuitivement:

@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 dewhenAddCalledVerified() 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 lesdoAnswer() ci-dessous.

3. Capture d'argument

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

Dans l'exemple ci-dessus,verify() est utilisé 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 utilisonsdoNothing() comme nous l'avons fait ci-dessus, mais avec unArgumentCaptor:

@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 àVoid

Une méthode peut avoir un comportement plus complexe que simplement ajouter ou définir une valeur. Pour ces situations, nous pouvons utiliser lesAnswer de Mockito pour ajouter le comportement dont nous avons besoin:

@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer((Answer) 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é dansMockito’s Java 8 Features, nous utilisons un lambda avecAnswer pour définir un comportement personnalisé pouradd().

5. Mocking partiel

Les simulacres partiels sont également une option. LesdoCallRealMethod() de Mockito peuvent être utilisés pour les méthodesvoid:

@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");
}

Cela nous permet d'appeler la méthode réelle est appelée et de la vérifier en même temps.

6. Conclusion

Dans ce bref didacticiel, nous avons couvert quatre façons différentes d'approcher les méthodesvoid lors des tests avec Mockito.

Comme toujours, les exemples sont disponibles enthis GitHub project.