我正在尝试编写一个测试用例,需要覆盖catch块。catch块捕获InterruptedException
或ExecutionException
,两者都在Future
对象的.get()
方法的方法签名中。我正在尝试使用Mockito中的thenThrow
模拟一个InterruptedException,当Future对象的.get()
方法被调用时,因此控件进入未覆盖的catch块。
futureData是List<Future<Class>>
类型,结果是Future<Class>
对象。
futureData.forEach(result -> {
try {
enginesData.add(result.get()); // the method I am using to force an exception using Mockito
} catch (InterruptedException | ExecutionException e) {
// the catch block I am trying to cover
}
});
下面是我的测试用例:
@Test
public void testInterruptedException () throws ExecutionException, InterruptedException {
...
InterruptedException interruptedException = new InterruptedException("Interrupted Exception");
when(oneFutureData.get()).thenThrow(CompletableFuture.completedFuture(interruptedException));
...
}
我试着连续写thenThrow
和doThrow
,但是仍然没有覆盖catch块。这是不是因为我试图模拟一个Future对象和一个Future类的方法?
1条答案
按热度按时间6qfn3psc1#
你需要在你的
// the catch block I am trying to cover
-块中做一些事情。例如,你可以调用一些记录器来把异常写到日志文件中,或者做其他事情。诀窍是你需要监视你在
// the catch block I am trying to cover
中调用的任何东西然后,您可以检查这个方法是否真的在您的catch区块中呼叫。
看看这个例子,如何实现这一点:
您的实际执行程式码看起来会与下列几行类似:
和
你自己试试:
git clone --depth 1 --branch so74236327 git@github.com:bodote/playground.git
查看package de.playground.so74236327
并运行FutureExceptionTest