Mockitoを使った例外投げ

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");
}

呼び出されたときにNullPointerExceptionをスローするようにgetMeaning()メソッド(タイプStringの値を返す)を構成したことに注意してください。

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");
}

ここでは、呼び出されたときにIllegalStateExceptionをスローするようにadd()メソッド(voidを返す)を構成しました。

コンパイラは角かっこ内の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

モックで行ったのと同じ方法で例外をスローするように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で見つけることができます。