在Java/Junit/Mockito中,模拟异常相当容易(doThrow()等),并且当抛出异常而未捕获异常时也相当容易验证(assertThrows()等)。但是,如果使用doThrow成功模拟了异常,但随后在主代码中捕获了异常,测试如何知道它曾经抛出过呢?
考虑以下代码段:
public void doFullOpeartion() {
try {
optionalService.blink();
}
catch (IOException exception) {
// No operation needed
}
字符串
测试代码如下:
doThrow(IOException.class).when(mockOptionalService).blink();
classUnderTest.doFullOperation();
// ??? - how do we know that IOException was thrown
型
如果在主代码的catch块中有一些可以验证的代码,那么问题就没有意义了。但如果我们不呢?
2条答案
按热度按时间btxsgosb1#
我更喜欢tddavies的答案(只要验证mock被调用了--因为你知道调用它意味着它会抛出)。但这里有另一个解决方案,它可能使您试图Assert的内容更加明确。
doAnswer
是更通用的Mockito原语,它可以返回值或抛出。在那里你可以只保留一个计数器。字符串
hlswsv352#
我不认为您可以检查异常是否真的被抛出,但是您可以验证您为抛出异常而被删除的方法是否真的被调用了。参见下面的示例,我们控制是否调用该方法,当它没有被调用时,测试失败:
字符串