32

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

顺便说一句,我已将@RunWith(PowerMockRunner.class)and添加@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());
4

3 回答 3

34

答案如下。

在此处咨询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之一。

于 2011-09-22T09:32:51.270 回答
6

或者

PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class, "add", Mathers.eq(12));
于 2016-10-19T19:49:42.520 回答
0

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

如何模拟静态方法。

根据您的链接...

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

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

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

于 2011-09-20T10:31:14.203 回答