【问题标题】:How to mock a void static method to throw exception with Powermock?如何模拟 void 静态方法以使用 Powermock 引发异常?
【发布时间】:2011-11-20 23:15:11
【问题描述】:

我正在尝试使用 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)就是设置mock静态方法的一部分。这意味着当使用参数 12 调用 Adder.add() 时,将抛出 IOException。很难理解,对吧? :) 所以应该写成下面这样。

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

【问题讨论】:

    标签: java unit-testing mockito powermock


    【解决方案1】:

    答案如下。

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

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

    编辑:
    链接已失效,请尝试Internet Archive 一个。

    【讨论】:

    • 这根本不直观。努力让这个工作。感谢您的提示。
    • 请注意,Adder.add(anyInt()); 不是此处触发异常的原因,它会将其应用于对 Adder.add() 的调用。
    【解决方案2】:

    或者

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

    【讨论】:

      【解决方案3】:

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

      How to Mock Static methods.

      根据您的链接...

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

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

      重要提示:每次方法验证都需要调用verifyStatic()

      【讨论】:

      • 我在这里阅读教程,因为我使用的是 Mockito。 code.google.com/p/powermock/wiki/MockitoUsage13没有说我必须使用回放模式。
      • 约翰。非常感谢。但这不是原因。我得到了答案。我会更新我的问题。
      猜你喜欢
      • 2012-03-24
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2013-03-09
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多