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

How to mock a static filed's void method executed?

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() 是否在 Class C 的方法 method2() 中执行。 我怎么能嘲笑?谢谢

可以这样,

 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

不同的观点:

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

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

含义:静态 调用在您的 类 之间创建直接的低级耦合。对于 "real world" 应用程序,这是您真正想要避免的事情。

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

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

@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);
    }
}

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