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で見つけることができます。