如何使用PowerMockito来验证超级方法被调用

时间:2014-11-14 01:08:08

标签: mockito powermock

我正在测试使用继承方法的遗留代码。我试图模仿超级方法 验证超级方法是否正在被呼叫。

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

我在期待"人类跑步"将被打印。但实际结果没有印刷。

1 个答案:

答案 0 :(得分:0)

PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class

这对你的情况不起作用,因为即使你做了演员,PowerMockito也会模拟人类的方法。 我检查了你的代码示例,并且可以说可以使用:

来抑制超类方法的调用
Method toReplace = PowerMockito.method(SuperHuman.class, "run");
PowerMockito.suppress(toReplace);

但似乎方法替换功能不适用于超类的方法: createPartialMock should support mocking overridden methods in super classes.

所以这不起作用:

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

但是你应该能够通过模拟仅在super方法中调用的其他类来间接地验证super方法的调用。 例如,检查是否使用“superhuman run”或类似的东西调用了System.out.println。