我试图模拟静态方法Thread.sleep(1);在调用时返回InterruptedException。我发现了一个似乎可以解决我的问题的问题,但是在设置我的代码与该问题的答案相同之后,它仍然没有用。
我发现的问题是:How to mock a void static method to throw exception with 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没有显示该方法的那部分的代码覆盖,我通过该方法调试以验证catch短语从未被命中。
感谢您查看我的问题!
答案 0 :(得分:3)
阅读答案告诉我,你还没有实际调用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()
这样的匹配器,然后继续执行测试。