你可以使用
PowerMock
来模拟实例化静态内部类。这可以通过准备实际实例化静态内部类的类来完成,因此在这里,它将是您定义了方法
someMethod()
的类。
假设
someMethod()
被定义在
MyOtherClass
类中并且不返回任何内容,则您的测试类应该如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyOtherClass.class)
public class MyClassTest {
@Test
public void test() throws Exception {
MyClass.MyStaticClass mock = Mockito.mock(MyClass.MyStaticClass.class);
PowerMockito.doAnswer(
new Answer<Void>() {
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
System.out.println("My new Answer");
return null;
}
}
).when(mock).callSomeMethod();
PowerMockito.whenNew(MyClass.MyStaticClass.class)
.withArguments(Matchers.any(), Matchers.any(), Matchers.any())
.thenReturn(mock);
MyOtherClass mc = new MyOtherClass();
mc.someMethod();
}
}
假设我的类
MyClass
看起来像这样:
public class MyClass {
public static class MyStaticClass {
public MyStaticClass(Object arg1, Object arg2, Object arg3) {
System.out.println("Called constructor");
}
public void callSomeMethod() {
System.out.println("callSomeMethod");
}
}
}
我的类 MyOtherClass
的样子如下:
public class MyOtherClass {
public void someMethod() {
MyClass.MyStaticClass myStaticClassInstance = new MyClass.MyStaticClass(
new Object(), new Object(), new Object()
);
myStaticClassInstance.callSomeMethod();
}
}
如果我启动我的测试,我会得到预期的结果:
My new Answer
与其默认获取的内容相比:
Called constructor
callSomeMethod
关于如何构造新对象的更多详细信息,请参见如何模拟构造新对象。
SomeClass
中实例化MyStaticClass
。你应该使用依赖反转将MyStaticClass
的实例注入到SomeClass
的实例中。 - Timothy Truckle