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リターンタイプ

まず、メソッドの戻り型が 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をスローします。

コンパイラは角かっこ内のvoidメソッドを許可しないため、 when()。thenThrow()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にあります。