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.