在模拟静态void时,Powermockito不会抛出异常

时间:2012-12-04 20:12:28

标签: java powermock

我试图模拟静态方法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短语从未被命中。

感谢您查看我的问题!

1 个答案:

答案 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()这样的匹配器,然后继续执行测试。