如何模拟执行的静态文件的 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" 应用程序,这是您真正想要避免的事情。
您有两种方法可以解决您的问题:
- 为 class A
抑制 static initialisation
- Mock constructor
至于我,我更喜欢在这种情况下使用抑制静态初始化,因为它给了我更多的控制权。
@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);
}
}
我还没有检查代码。如何解决您的问题是一般的想法。
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" 应用程序,这是您真正想要避免的事情。
您有两种方法可以解决您的问题:
- 为 class A 抑制 static initialisation
- Mock constructor
至于我,我更喜欢在这种情况下使用抑制静态初始化,因为它给了我更多的控制权。
@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);
}
}
我还没有检查代码。如何解决您的问题是一般的想法。