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);
}
}
我还没有检查代码。这是你的问题如何解决的一般想法。