如何模拟静态文件的 void 方法执行?


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((中执行。我怎么能嘲笑?谢谢

不同的观点:

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

因此:与其求助于"大"PowerMock锤子,以某种方式使您能够测试难以测试的代码;考虑退一步改进你的设计!

意思是:静态调用在类之间创建直接的低级别耦合。对于"真实世界"的应用程序来说,这是您真正想要避免的事情。

可以是这样的

 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

您有两种方法来解决问题:

  • 抑制A类的静态初始化
  • 模拟构造函数

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class) 
@SuppressStaticInitializationFor("classapackage.A")
public class Test{
    @Mock
    private B bMock;
    @Before
    public void setUp(){
       // if A.b public 
       A.b = bMock
       // if b private 
       org.powermock.reflect.Whitebox.setInternalState(A.class,"b", bMock);
    }
}

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

相关内容

  • 没有找到相关文章

最新更新