1. 概述
在这个快速教程中,我们将重点讲解如何使用Mockito配置方法调用来抛出异常。
有关该库的更多信息,请查看我们的Mockito系列教程。
这里是我们将使用的简单字典类:
class MyDictionary {
private Map<String, String> wordMap;
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
void givenNonVoidReturnType_whenUsingWhenThen_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class);
assertThrows(NullPointerException.class, () -> dictMock.getMeaning("word"));
}
请注意,我们已配置了返回类型为String的getMeaning()
方法,使其在被调用时抛出NullPointerException
。
*3. void返回类型*
现在,如果我们的方法返回void,我们将使用doThrow()
:
@Test
void givenVoidReturnType_whenUsingDoThrow_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
doThrow(IllegalStateException.class).when(dictMock)
.add(anyString(), anyString());
assertThrows(IllegalStateException.class, () -> dictMock.add("word", "meaning"));
}
在这里,我们配置了一个返回void的add()
方法,在调用时抛出IllegalStateException
。
对于void返回类型,我们不能使用when().thenThrow()
,因为编译器不允许在括号内使用void方法。
4. 异常作为对象
为了配置异常本身,我们可以像之前示例那样传递异常的类,也可以作为对象:
@Test
void givenNonVoidReturnType_whenUsingWhenThenAndExeceptionAsNewObject_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred"));
assertThrows(NullPointerException.class, () -> dictMock.getMeaning("word"));
}
对于doThrow()
,我们也可以这样做:
@Test
void givenNonVoidReturnType_whenUsingDoThrowAndExeceptionAsNewObject_thenExceptionIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
doThrow(new IllegalStateException("Error occurred")).when(dictMock)
.add(anyString(), anyString());
assertThrows(IllegalStateException.class, () -> dictMock.add("word", "meaning"));
}
5. 模拟对象
我们还可以以与mock相同的方式为模拟对象(Spy)配置抛出异常:
@Test
void givenSpyAndNonVoidReturnType_whenUsingWhenThen_thenExceptionIsThrown() {
MyDictionary dict = new MyDictionary();
MyDictionary spy = Mockito.spy(dict);
when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class);
assertThrows(NullPointerException.class, () -> spy.getMeaning("word"));
}
6. 总结
在这篇文章中,我们探讨了如何在Mockito中配置方法调用以抛出异常。
如往常一样,完整的源代码可以在GitHub上找到。