Exception moqueuse Lancer à l’aide de Mockito

Exception moqueuse Lancer à l'aide de Mockito

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons nous concentrer sur la façon de configurer un appel de méthode pour lever une exception avec Mockito.

Pour plus d'informations sur la bibliothèque, consultez également nosMockito series.

Voici une classe de dictionnaire simple que nous utiliserons dans ces exemples:

class MyDictionary {
    private Map wordMap = new HashMap<>();

    public void add(String word, String meaning) {
        wordMap.put(word, meaning);
    }

    public String getMeaning(String word) {
        return wordMap.get(word);
    }
}

2. Type de retour non -Void

Premièrement, si le type de retour de notre méthode n'est pasvoid, nous pouvons utiliserwhen().thenThrow():

@Test(expected = NullPointerException.class)
public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    when(dictMock.getMeaning(anyString()))
      .thenThrow(NullPointerException.class);

    dictMock.getMeaning("word");
}

Remarquez, nous avons configuré la méthodegetMeaning() - qui renvoie une valeur de typeString - pour lancer unNullPointerException lorsqu'elle est appelée.

3. Void Type de retour

Maintenant, si notre méthode renvoievoid,, nous utiliseronsdoThrow():

@Test(expected = IllegalStateException.class)
public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(IllegalStateException.class)
      .when(dictMock)
      .add(anyString(), anyString());

    dictMock.add("word", "meaning");
}

Ici, nous avons configuré une méthodeadd() - qui renvoievoid - pour lancerIllegalStateException lorsqu'elle est appelée.

Nous ne pouvons pas utiliserwhen().thenThrow() avec le type de retourvoid car le compilateur n'autorise pas les méthodesvoid entre crochets.

4. Exception en tant qu'objet

À propos de la configuration de l'exception elle-même, nous pouvons transmettre la classe de l'exception comme dans nos exemples précédents ou en tant qu'objet:

@Test(expected = NullPointerException.class)
public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    when(dictMock.getMeaning(anyString()))
      .thenThrow(new NullPointerException("Error occurred"));

    dictMock.getMeaning("word");
}

Et nous pouvons faire la même chose avecdoThrow():

@Test(expected = IllegalStateException.class)
public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() {
    MyDictionary dictMock = mock(MyDictionary.class);
    doThrow(new IllegalStateException("Error occurred"))
      .when(dictMock)
      .add(anyString(), anyString());

    dictMock.add("word", "meaning");
}

5. Spy

Nous pouvons également configurerSpy pour lancer une exception de la même manière que nous l'avons fait avec le simulacre:

@Test(expected = NullPointerException.class)
public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() {
    MyDictionary dict = new MyDictionary();
    MyDictionary spy = Mockito.spy(dict);
    when(spy.getMeaning(anyString()))
      .thenThrow(NullPointerException.class);

    spy.getMeaning("word");
}

6. Conclusion

Dans cet article, nous avons expliqué comment configurer des appels de méthode pour générer une exception dans Mockito.

Comme toujours, le code source complet peut être trouvéover on GitHub.