Бросок исключений с помощью Mockito

Насмешливое Бросание Исключений с использованием Мокито

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.