Насмешливое Бросание Исключений с использованием Мокито
1. обзор
В этом кратком руководстве мы сосредоточимся на том, как настроить вызов метода для создания исключения с помощью Mockito.
Для получения дополнительной информации о библиотеке также ознакомьтесь с нашимMockito series.
Вот простой класс словаря, который мы будем использовать в этих примерах:
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. Тип возврата неVoid
Во-первых, если тип возврата нашего метода не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 Тип возврата
Теперь, если наш метод возвращает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
Мы также можем настроить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.
Как всегда, полный исходный код можно найтиover on GitHub.