Мокинг выброса исключений с использованием Mockito

1. Обзор

В этом кратком руководстве мы сосредоточимся на том, как настроить вызов метода для создания исключения с помощью Mockito.

Для получения дополнительной информации о библиотеке также ознакомьтесь с нашей серией Mockito.

Вот простой класс словаря, который мы будем использовать в этих примерах:

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. Non- Пустота Возвращаемый тип

Во-первых, если тип возврата нашего метода не является недействительным, мы можем использовать when (). ThenThrow () :

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

Обратите внимание, мы настроили метод getMeaning (), который возвращает значение типа String, чтобы при вызове генерировать исключение NullPointerException .

3. Тип возврата пустоты

Теперь, если наш метод возвращает void, мы будем использовать 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"); }

Здесь мы настроили метод add (), который возвращает void, для выдачи исключения IllegalStateException при вызове.

Мы не можем использовать when (). ThenThrow () с возвращаемым типом void, поскольку компилятор не позволяет использовать методы void внутри скобок.

4. Исключение как объект

Что касается настройки самого исключения, мы можем передать класс исключения, как в наших предыдущих примерах, или как объект:

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

И мы можем сделать то же самое с doThrow () :

@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 так, чтобы он генерировал исключение, как мы это делали с макетом:

@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. Заключение

В этой статье мы изучили, как настроить вызовы методов для создания исключения в Mockito.

Как всегда, полный исходный код можно найти на GitHub.