Перейти к основному содержимому

Имитация исключения исключения с использованием Mockito

· 2 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 .