如何使用Powermock模拟void静态方法抛出异常?

时间:2011-09-20 10:22:35

标签: java unit-testing mockito powermock

我正在尝试使用Powermock和Mockito来模拟一个void静态方法来抛出异常,如下所示。但我遇到了一个问题。除非我使用相同的参数对Adder.add()进行两次调用,否则不会抛出模拟的IOException

顺便说一下,我已将@RunWith(PowerMockRunner.class)@PrepareForTest(Adder.class)添加到单元测试类中。

class Adder{
    public static void add(int i) throws IOException{
        return;
    }
}

@Test
public void testAdder() throws IOException{
    PowerMockito.mockStatic(Adder.class);
    PowerMockito.doThrow(new IOException()).when(Adder.class);
    Adder.add(12);
    try {
        Adder.add(11);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // assert things 
}

提前致谢。 :)

答案如下。

在咨询http://code.google.com/p/powermock/issues/detail?id=278之后,实际上上面的Adder.add(12)是设置模拟静态方法的一部分。这意味着在使用参数12调用Adder.add()时,将抛出IOException。这很难理解,对吧? :)所以它应该写成如下。

PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(anyInt());

3 个答案:

答案 0 :(得分:27)

答案如下。

在咨询http://code.google.com/p/powermock/issues/detail?id=278之后,实际上上面的Adder.add(12)是设置模拟静态方法的一部分。这意味着在使用参数12调用Adder.add()时,将抛出IOException。这很难理解,对吧? :)所以它应该写成如下。

PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(anyInt());

编辑:
链接已死,请尝试使用Internet Archive

答案 1 :(得分:4)

PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12));

答案 2 :(得分:0)

您是否忘记将PowerMock置于重放模式?

How to Mock Static methods.

根据您的链接...

如何验证行为 静态方法的验证分两步完成。首先调用PowerMockito.verifyStatic()以开始验证行为,并调用要验证的静态方法。 E.g。

 PowerMockito.verifyStatic();
 Static.firstStaticMethod(param);

重要提示:您需要按方法验证调用verifyStatic()