2012-12-04 57 views
2

我试图嘲笑静态方法Thread.sleep(1);当它被调用时返回一个InterruptedException。我发现了一个似乎解决了我的问题的SO问题,但是在将我的代码设置为与该问题的答案相同之后,它仍然无法工作。Powermockito不会抛出一个异常时,嘲笑静态void

所谓的问题,我发现是: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

您的代码看起来几乎完全像您发布的链接中问题中的代码。你有没有尝试过一些看起来像那个人提出的答案? – femtoRgon

+0

它看起来几乎完全像那个代码,因为我复制了他们的解决方案。我不确定它是否对我不起作用,因为我做了不同的/错误的事情,或者它不能专门用于Thread.sleep。 – CorayThan

+0

不要只是复制代码,请阅读他们所写的内容。我认为你错过了他们解决方案的背景。 – femtoRgon

回答

2

读答案指示给我,说你还没有真正执行了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()这样的匹配器,然后继续执行测试。

+0

我用anyInt()试过了,我没有在我的断言中包含我的assert语句,它不会超出Thread.sleep方法,所以我认为我已经完成了所有这些。对不起,我应该在我原来的问题上更加完整! – CorayThan

+0

啊,好吧。认为这是你的测试方法的全部范围。您提到调试该方法。你有没有试过打电话给被测单元中的Thread.sleep(1),看看那里执行了什么(不管它执行实际的Thread.sleep还是步入某种Mockito体系结构)? – femtoRgon