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

抽象类中@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:43:40