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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:45:36