如何模拟静态字段的void方法执行?

时间:2016-08-04 07:34:27

标签: java mockito powermock

public class A { 
    public static B b = new B();
}

public B{
  public void method(Interface arg){}
}

public C {
  public void method2 (Object arg2){

    InterfaceInstance d = new InterfaceInstance;
    A.b.method(d);
  }
}

我想测试A.b.method()是否在C类的方法method2()中执行。 我怎么能嘲笑?感谢。

3 个答案:

答案 0 :(得分:3)

不同的观点:

静态是良好OO设计中的异常。你应该有充分的理由想出你想要调用方法的静态字段。因为它们迫使您使用PowerMock(ito)来测试它。

所以:而不是转向“大”PowerMock锤子,以某种方式使您能够测试难以测试的代码;考虑退一步并改进你的设计!

含义:静态调用在类之间创建直接的低级耦合。对于“真实世界”的应用程序,这是你真正想要避免的。

答案 1 :(得分:2)

可以这样,

 PowerMockito.mockStatic(A.class);
 ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class);
 PowerMockito.doNothing().when(
               A.class, "method", captor.capture());//mock static

 C c = new C();
 c.method2(new String("Mock"));

 PowerMockito.verifyStatic(times(1));
 Object obj = captor.getValue();//if you want check the object passed

答案 2 :(得分:0)

您有两种方法可以解决您的问题:

至于我,我更喜欢在这种情况下使用抑制静态初始化,因为它给了我更多的控制权。

<select id="getManager" resultMap="user">
    select .......
</select>

我没有检查过代码。一般的想法是如何解决你的问题。