[英]Issues trying throw checked exception with mockito
我有下面的界面
public interface Interface1 {
Object Execute(String commandToExecute) throws Exception;
}
然后,我尝试进行模拟,以便可以测试将其调用的类的行为:
Interface1 interfaceMocked = mock(Interface1.class);
when(interfaceMocked.Execute(anyString())).thenThrow(new Exception());
Interface2 objectToTest = new ClassOfInterface2(interfaceMocked);
retrievePrintersMetaData.Retrieve();
但是编译器告诉我,有一个未处理的异常。 Retrieve方法的定义是:
public List<SomeClass> Retrieve() {
try {
interface1Object.Execute("");
}
catch (Exception exception) {
return new ArrayList<SomeClass>();
}
}
Mockito文档仅显示RuntimeException的用法,而我在StackOverflow上也没有看到类似内容。 我正在使用Java 1.7u25和Mockito 1.9.5
假设您的测试方法没有声明它抛出Exception
,那么编译器是绝对正确的。 这行:
when(interfaceMocked.Execute(anyString())).thenThrow(new Exception());
...在Interface1
的实例上调用Execute
。 那会抛出Exception
,所以您要么需要捕获它,要么声明您的方法将其抛出。
我个人建议仅声明测试方法抛出Exception
。 没有别的要关心那个声明了,您真的不想抓住它。
如果您的方法返回一些东西并抛出错误,那么您应该不会有任何问题。 现在,如果您的方法返回void,您将无法引发错误。
现在真正的事实是,您不是要测试接口是否引发异常,而是要测试在此方法中引发异常时会发生什么。
public List<SomeClass> Retrieve() {
try {
interface1Object.Execute("");
}
catch (Exception exception) {
return handleException(exception);
}
}
protected List<SomeClass> handleException(Exception exception) {
return new ArrayList<SomeClass>();
}
然后,您只需调用handleException方法并确保它返回正确的值即可。 如果需要确保接口引发异常,那么这是对接口类的另一种测试。
您似乎不得不为一行编写一个方法似乎很麻烦,但是如果您需要可测试的代码,有时就会发生这种情况。
您可以使用Mockito的doAnswer方法引发已检查的异常,像这样
Mockito.doAnswer(
invocation -> {
throw new Exception("It's not bad, it's good");
})
.when(interfaceMocked)
.Execute(org.mockito.ArgumentMatchers.anyString());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.