如何用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
相关产品推荐
相关产品推荐

