Spottende Ausnahme mit Mockito werfen

Verspottende Ausnahme Werfen mit Mockito

1. Überblick

In diesem kurzen Tutorial konzentrieren wir uns darauf, wie Sie einen Methodenaufruf konfigurieren, um eine Ausnahme mit Mockito auszulösen.

Weitere Informationen zur Bibliothek finden Sie auch in unserenMockito series.

Hier ist eine einfache Wörterbuchklasse, die wir in diesen Beispielen verwenden werden:

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. Nicht -Void Rückgabetyp

Erstens können wirwhen().thenThrow() verwenden, wenn unser Methodenrückgabetyp nichtvoid ist:

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

    dictMock.getMeaning("word");
}

Beachten Sie, dass wir die MethodegetMeaning() konfiguriert haben, die einen Wert vom TypString zurückgibt, um einenNullPointerException zu werfen, wenn sie genannt werden.

3. Void Rückgabetyp

Wenn unsere Methodevoid, zurückgibt, verwenden wirdoThrow():

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

Hier haben wir eineadd()-Methode konfiguriert, dievoid zurückgibt, um beim AufrufIllegalStateException zu werfen.

Wir könnenwhen().thenThrow() nicht mit dem Rückgabetypvoid verwenden, da der Compiler die Methoden vonvoidin Klammern nicht zulässt.

4. Ausnahme als Objekt

Über die Konfiguration der Ausnahme selbst können wir die Klasse der Ausnahme wie in unseren vorherigen Beispielen oder als Objekt übergeben:

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

Und wir können dasselbe auch mitdoThrow() tun:

@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

Wir könnenSpy auch so konfigurieren, dass eine Ausnahme ausgelöst wird, wie wir es mit dem Mock getan haben:

@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. Fazit

In diesem Artikel wurde untersucht, wie Methodenaufrufe konfiguriert werden, um eine Ausnahme in Mockito auszulösen.

Wie immer kann der vollständige Quellcodeover on GitHub gefunden werden.