我在理解以下代码背后的语义时遇到问题。
@Test
public void TestAbc() throws AbcException {
// method to test
object.handle();
// assertions
verify(someThing).someMethod();
verify(problemObject).problemMethod();
}
handle方法的定义如下:
public void handle() {
try {
someThing.someMethod();
// throws AbcException
problemObject.problemMethod();
}
catch (AbcException e) {
LOGGER.error(e.getMessage());
}
}
现在,在测试中,我正在执行
throws AbcException
来使语法在语法上正确无误,但这实际上没有任何意义,因为我在handle方法中捕获了该异常,并且没有将其进一步抛出。但是测试方法会转换为“ TestAbc
引发AbcException
”,实际上并非如此。所以我的问题是,为什么即使我的测试方法没有抛出throws AbcException
,也需要添加它?有人可以帮我理解吗? 最佳答案
verify(problemObject)
返回Mockito类的实例,该实例用于指定要验证的内容。为了使您可以简单地在此对象上调用problemMethod()
的流利的语法,该类实现了problemObject
所模拟的接口(或扩展了该类)。即使此类中的problemMethod()
只是具有检查是否在模拟程序上调用了problemMethod()
的效果,Java编译器也不知道这一点,只会看到您正在调用签名为throws AbcException
的方法,因此您需要处理它。
附注:除非您有其他设置代码,否则模拟的problemMethod
实际上不会抛出任何内容-您需要为此明确设置模拟:
when(problemObject.problemMethod()).thenThrow(new AbcException());