抽象类中@Autowired对象的doCallRealMethod失效问题排查
问题:子类测试用例未进入enrichEvent方法的解决办法
我正在为继承抽象父类的子类编写测试用例,采用下述实现方式后,程序流程未进入enrichEvent方法。
抽象类代码
public abstract class StudentProcessor implements IStudentProcessor<Event> { @Autowired private StudentService studentService; public void processEvent(Event events){ studentService.enrichEvent(event); // void return type } }
子类测试用例代码
@RunWith(MockitoJUnitRunner.class) public class ChildStudentProcessorTest { @Mock private StudentService studentService; @InjectMocks private StudentProcessor childStudentEventProcessor = new ChildStudentProcessor(); @Before public void setUp() { doCallRealMethod().when(studentService).enrichEvent(Mockito.any()); } @Test public void test_vanilaScenario() { Event baseModel = ParserUtil.getObjectFromFile("events/event1.json", Event.class); childStudentEventProcessor.processEvent(baseModel); } }
解决步骤
1. 修正抽象类的参数拼写错误
抽象类processEvent方法定义的参数是events,但调用enrichEvent时传入的是未定义的event,这会导致编译失败或逻辑跳转异常。修正后代码:
public void processEvent(Event event){ studentService.enrichEvent(event); }
2. 检查子类是否正确继承父类逻辑
如果子类ChildStudentProcessor重写了processEvent方法但未调用super.processEvent(event),父类中的enrichEvent调用逻辑不会执行。需确保:
- 子类不重写
processEvent方法,直接继承父类逻辑 - 若必须重写,需显式调用父类方法:
public class ChildStudentProcessor extends StudentProcessor { @Override public void processEvent(Event event) { super.processEvent(event); // 触发父类的enrichEvent调用 // 子类自定义逻辑 } }
3. 验证方法调用(替代强制执行真实方法)
如果你的目标是确认enrichEvent被正确触发,无需强制执行真实方法,只需在测试末尾添加验证逻辑即可:
@Test public void test_vanilaScenario() { Event baseModel = ParserUtil.getObjectFromFile("events/event1.json", Event.class); childStudentEventProcessor.processEvent(baseModel); // 验证enrichEvent是否被调用,参数是否匹配 verify(studentService).enrichEvent(baseModel); }
4. 优化Mock对象注入写法
将测试实例直接声明为子类类型,避免父类类型带来的歧义,同时确保Mockito注入逻辑更清晰:
@InjectMocks private ChildStudentProcessor childStudentEventProcessor = new ChildStudentProcessor();
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

