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

为什么Mockito的when-then在抽象类注入Mock的方法调用中不生效?

when-then规则不生效的原因

问题核心和when-then语法本身无关,本质是Mockito的@InjectMocks注解不会自动给被测类继承自抽象父类的成员字段做依赖注入。

具体触发链路

结合你的代码场景(示例代码里方法体缺少分号的问题属于书写笔误,不影响核心问题判断):

  • 执行@InjectMocks创建B类实例时,Mockito的字段注入逻辑仅会扫描B类自身直接声明的成员变量
  • 它可以正常识别并注入B自己定义的objB字段,但objA是定义在抽象父类A中的字段,不属于B类自身的声明范围,自动注入逻辑不会触达这个从父类继承来的字段
  • 最终B实例从父类继承的objA字段值为null,调用methodB()走到父类的methodA()时,执行objA.x()根本不会触发你提前配置的mock规则(因为实际运行时引用的是null对象,不是你创建的mockobjA实例),自然返回null。

可落地的修复方案

  • 方案1:在测试初始化阶段通过反射手动赋值
    跳过自动注入的限制,在@Before方法中,通过反射获取b实例上对应objA字段的引用,关闭访问检查后直接赋值为你mock出来的objA对象即可。
  • 方案2:调整业务代码的依赖注入形式
    把字段注入改成构造器注入:在抽象类A中通过构造方法接收ObjA依赖,子类B的构造方法通过super()调用父类构造方法传入对应依赖。这种场景下@InjectMocks走构造器注入逻辑时,会自动匹配对应类型的mock参数,正确完成全继承链的依赖注入。
  • 方案3:绕开@InjectMocks的自动注入逻辑
    在测试初始化方法中手动实例化B对象,再通过反射给所有需要的依赖(包括从父类继承的objA、自身的objB)手动赋值,不受自动注入扫描范围的限制。

避坑提示

@InjectMocks的字段注入能力仅覆盖被测类本身声明的字段,不会向上遍历继承链查找父类的同类型字段,只有构造器注入、setter方法注入的场景才会沿着继承链匹配依赖参数,这是该类问题最常见的触发场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 18:45:01