我正在测试使用继承方法的遗留代码。我试图嘲笑超级方法验证是否调用了超方法。
@RunWith(PowerMockRunner.class)
public class HumanTest {
@Test
public void test() throws NoSuchMethodException, SecurityException {
// 1. arrange
Human sut = PowerMockito.spy(new Human());
PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class
// 2. action
sut.run();
// 3. assert / verify
}
}
public class Human extends SuperHuman {
@Override
public void run() {
System.out.println("human run");
super.run();
}
}
public class SuperHuman {
public void run() {
System.out.println("superhuman run");
}
}
我期待"人类奔跑"会被打印出来。但实际结果没有打印出来。
PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class
这在您的情况下不起作用,因为即使您进行了铸造,PowerMockito也会模拟人类的方法。我检查了您的代码示例,可以说可以使用以下内容抑制对超类方法的调用:
Method toReplace = PowerMockito.method(SuperHuman.class, "run");
PowerMockito.suppress(toReplace);
但是方法替换功能似乎不适用于超类的方法:createPartialMock 应该支持在超类中模拟重写的方法。
所以这不起作用:
PowerMockito.replace(toReplace).with(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Method of superclass has been invoked !");
return null;
}
});
但是你仍然应该能够通过模拟仅在超级方法中调用的其他类来间接验证超级方法的调用。例如,检查System.out.println是否被调用了"超人运行"或类似的东西。