Mocking Exception Throwing mit Mockito

1. Übersicht

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 unserer Mockito-Reihe.

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. Rückgabetyp ohne Leere

Erstens, wenn unser Methodenrückgabetyp nicht ungültig ist , können wir when () verwenden. ThenThrow () :

@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 Methode getMeaning () , die einen Wert vom Typ String zurückgibt , so konfiguriert haben, dass beim Aufruf eine NullPointerException ausgelöst wird .

3. Void Return Type

Wenn unsere Methode nun void zurückgibt , verwenden wir doThrow () :

@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 konfiguriert wir ein add () Methode - die gibt Leere - zu werfen Illegal , wenn sie aufgerufen.

Wir können when (). ThenThrow () mit dem Rückgabetyp void nicht verwenden, da der Compiler keine void- Methoden in Klammern 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"); }

Dasselbe können wir auch mit doThrow () 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. Spionieren

Wir können Spy 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 haben wir untersucht, wie Methodenaufrufe konfiguriert werden, um eine Ausnahme in Mockito auszulösen.

Wie immer finden Sie den vollständigen Quellcode auf GitHub.