【问题标题】:How to use PowerMockito to verify super method is called如何使用 PowerMockito 验证超级方法是否被调用
【发布时间】:2025-12-30 23:25:06
【问题描述】:

我正在测试使用继承方法的遗留代码。我正在尝试模拟超级方法 验证是否调用了超级方法。

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

我期待“human run”会被打印出来。但实际结果没有打印出来。

【问题讨论】:

    标签: mockito powermock


    【解决方案1】:
    PowerMockito.doNothing().when((SuperHuman) sut).run(); // SuperHuman is the parent class
    

    这不适用于您的情况,因为即使您进行了强制转换,PowerMockito 也会模拟 Human 的方法。 我检查了您的代码示例,可以说可以通过以下方式抑制对超类方法的调用:

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

    但是您仍然应该能够通过模拟仅在超级方法中调用的其他类来间接验证超级方法的调用。 例如检查 System.out.println 是否被“superhuman run”或类似的东西调用。

    【讨论】:

      最近更新 更多