2

我正在尝试模拟静态方法 Thread.sleep(1); 调用时返回 InterruptedException。我发现了一个似乎可以解决我的问题的 SO question,但是在将我的代码设置为与该问题的答案相同之后,它仍然无法正常工作。

我发现的 SO 问题是: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 没有显示该部分方法的代码覆盖率,并且我通过该方法进行调试以验证标语永远不会被击中。

感谢您查看我的问题!

4

1 回答 1

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) 是设置模拟静态方法的一部分”。

您可能应该anyInt()在第一次“调用”Thread.sleep 时使用匹配器,然后继续执行测试。

于 2012-12-04T20:41:44.947 回答