Mockito无法为类中泛型字段注入Mock的问题求助
解决Mockito @InjectMocks实例化失败问题
问题重现
目标类结构:
public class MyClass <T extends InterfaceA & InterfaceB> { private final T someOtherClass; public MyClass(T someOtherClass){ this.someOtherClass = someOtherClass; } }
测试代码尝试用@Mock+@InjectMocks自动注入,却抛出报错:
org.mockito.exceptions.misusing.InjectMocksException: Cannot instantiate @InjectMocks field named 'myClass' of type MyClass. You haven't provided the instance at field declaration so I tried to construct the instance. However the constructor or the initialization block threw an exception : null
无论用实现双接口的实体类NewClass,还是合并双接口的空接口InterfaceAandB,都会触发相同报错。
问题原因
Mockito的@InjectMocks自动实例化类时,会优先尝试构造函数注入,但它是通过参数名称来匹配@Mock标记的字段的。你的MyClass构造参数名为someOtherClass,但测试里的mock字段叫newClass或someName,名称不匹配导致Mockito找不到对应的mock对象传入构造函数,最终构造函数拿到null参数,抛出异常。
解决方案
方案1:手动实例化MyClass(最推荐)
跳过@InjectMocks,直接用mock对象创建MyClass实例,简单可靠:
@ExtendWith(MockitoExtension.class) public class MyeTest { @Mock private NewClass newClass; private MyClass<NewClass> myClass; @BeforeEach void setUp() { myClass = new MyClass<>(newClass); } @Test void someTest() { // 测试逻辑 } }
如果用合并接口的方式:
@ExtendWith(MockitoExtension.class) public class MyeTest { @Mock private InterfaceAandB mockInstance; private MyClass<InterfaceAandB> myClass; @BeforeEach void setUp() { myClass = new MyClass<>(mockInstance); } @Test void someTest() { // 测试逻辑 } }
方案2:让mock字段名称和构造参数名称一致
如果一定要用@InjectMocks,把mock字段的名字改成和构造参数someOtherClass完全一致,Mockito就能自动匹配注入:
@ExtendWith(MockitoExtension.class) public class MyeTest { @Mock private NewClass someOtherClass; // 名称与构造参数保持一致 @InjectMocks private MyClass<NewClass> myClass; @Test void someTest() { // 测试逻辑 } }
总结
手动实例化的方式最直接,能避免依赖Mockito的自动注入规则,减少不必要的适配问题;如果习惯用@InjectMocks,严格匹配字段与构造参数的名称即可解决问题。
内容的提问来源于stack exchange,提问作者Shad
相关产品推荐
相关产品推荐

