1. Обзор
В этом кратком руководстве мы сосредоточимся на том, как настроить вызов метода для создания исключения с помощью Mockito.
Для получения дополнительной информации о библиотеке также ознакомьтесь с нашей серией Mockito .
Вот простой класс словаря, который мы будем использовать:
class MyDictionary {
private Map<String, String> wordMap = new HashMap<>();
public void add(String word, String meaning) {
wordMap.put(word, meaning);
}
public String getMeaning(String word) {
return wordMap.get(word);
}
}
2. Непустой возвращаемый
тип
Во- первых, если возвращаемый тип нашего метода не void
, мы можем использовать 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 .