You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JUnit验证子类重写方法中父类方法被调用?

验证子类重写方法中调用父类方法的JUnit测试方案

待测试代码

class BaseService {
    public void print(String msg) {
       // 业务逻辑
    }
}

class ChildService extends BaseService {
    @Override
    public void print(String msg) {
        super.print(msg);
    }
}

问题描述

我需要编写JUnit测试,验证子类ChildService重写的print方法中是否调用了父类BaseService的对应方法。查了不少相关讨论,没找到适配这个场景的方案。

无效的尝试方案

我试过下面的代码,但它只验证了父类方法本身被调用,完全没验证子类方法里是否触发了父类方法的调用:

BaseService classToTest = Mockito.spy(new BaseService());
Mockito.doNothing().when((ChildService)classToTest).print("test message");
classToTest.print("test message");
verify(classToTest).print("test message");

这个方案的问题在于:spy的是父类实例而非子类,强制类型转换没有意义,根本没执行子类的重写逻辑。

正确的测试方案

通过Mockito spy子类实例,配合父类类型的验证,可以实现需求:

// 1. 创建子类的spy实例,保留真实逻辑同时监控方法调用
ChildService childService = Mockito.spy(new ChildService());

// 2. 调用子类的重写方法
childService.print("test message");

// 3. 将子类实例转为父类类型,验证父类的print方法被调用
Mockito.verify((BaseService) childService).print("test message");

逻辑说明

  • spy子类实例:确保执行的是子类重写后的print方法逻辑,同时能监控内部的方法调用。
  • 验证父类方法:通过向上转型,让Mockito识别并验证父类的print方法是否被子类方法触发调用。

内容的提问来源于stack exchange,提问作者user09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:25:23