我试图模拟静态方法 Thread.sleep(1); 在调用时返回 InterruptedException。我发现了一个似乎可以解决我问题的 SO 问题,但是在将我的代码设置为与该问题的答案相同后,它仍然不起作用。
我发现的 SO 问题是:如何模拟一个 void 静态方法以使用 Powermock 抛出异常?
这是我尝试测试的方法的片段:
try {
Thread.sleep(1);
} catch (InterruptedException ie) {
LOGGER.error("failure to sleep thread for 1 millisecond when persisting
checkpoint. exception is: " + ie.getMessage());
}
这是我的测试类中的一个片段,它显示了我试图模拟 Thread.sleep(1) 来做我想做的事:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Thread.class)
public class TestCheckpointDaoNoSQL {
@Test
public void test() throws InterruptedException {
PowerMockito.mockStatic(Thread.class);
PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
Thread.sleep(1);
}
}
我还尝试嘲笑 InterruptedException 来抛出而不是创建一个新的,但这没有帮助。我可以说没有抛出异常,因为 ECLEMMA 没有显示该方法该部分的代码覆盖率,并且我通过该方法进行了调试以验证标语从未被击中。
感谢您查看我的问题!
阅读答案向我表明,您实际上还没有调用 Thread.sleep,而是刚刚完成模拟设置:
@Test
public void test() throws InterruptedException {
PowerMockito.mockStatic(Thread.class);
PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
Thread.sleep(1); //This is still setting up the mock, not actually invoking the method.
}
注意那里在顶部所说的内容:"除非我使用相同的参数对Adder.add()进行两次调用,否则模拟的IOException不会被抛出。 后来,"事实上,上面的 Adder.add(12) 是设置模拟静态方法的一部分"。
您可能应该在对 Thread.sleep 的第一次"调用"中使用像 anyInt()
这样的匹配器,然后继续执行测试。