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

如何使用Mockito对@Inject注解的Api类进行mock操作?

问题根因与调整方案

核心错误点

  • 未初始化Mockito注解,也未将Mock实例注入到被测试业务类的@Inject字段中,导致业务类中引用的MemberApi始终为null
  • thenReturn语法错误:anyObject()是参数匹配器,仅可用于when的入参匹配逻辑,不能作为返回值使用,必须返回具体的实例对象
  • 业务代码疑似笔误:你贴出的业务代码中调用的是MemberApi.addMember()(大写开头,属于类静态方法调用),但声明的注入字段是成员变量memberApi(小写开头),如果实际为静态方法调用,需要额外用Mockito-inline依赖实现静态方法Mock,以下方案默认你是笔误,实际调用的是注入的成员变量memberApi.addMember()

具体调整步骤

1. 引入必要依赖(JUnit5环境示例)

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

2. 测试类代码调整(自动注入方案)

用@ExtendWith开启Mockito注解支持,通过@InjectMocks自动将Mock对象注入到被测试类的对应字段中:

// 开启Mockito扩展
@ExtendWith(MockitoExtension.class)
public class 你的业务类Test {

    // 要测试的业务类,Mockito会自动将@Mock对象注入到它的@Inject字段里
    @InjectMocks
    private 你的业务类 businessService;

    @Mock
    private MemberApi mockedMemberApi;

    @Test
    public void testAddMember() {
        // 1. 构造模拟返回的实例
        NewMember mockReturnMember = new NewMember();
        // 按需设置返回值的属性
        mockReturnMember.setId(123L);

        // 2. 正确配置Mock逻辑
        when(mockedMemberApi.addMember(any(CreateMemberParameterObj.class))).thenReturn(mockReturnMember);

        // 3. 执行业务方法测试
        NewMember result = businessService.你的业务方法();
        // 后续补充断言逻辑
        assertNotNull(result);
    }
}

3. 手动注入方案(无需注解扩展)

如果不想用Mockito扩展,也可以手动初始化Mock后通过反射注入到业务类:

public class 你的业务类Test {
    private 你的业务类 businessService;
    private MemberApi mockedMemberApi;

    @BeforeEach
    public void init() throws Exception {
        // 初始化所有@Mock对象
        MockitoAnnotations.openMocks(this);
        businessService = new 你的业务类();
        // 反射设置私有成员变量
        Field memberApiField = 你的业务类.class.getDeclaredField("memberApi");
        memberApiField.setAccessible(true);
        memberApiField.set(businessService, mockedMemberApi);
    }

    // 测试方法同上述自动注入方案的测试逻辑
}

静态方法调用适配方案

如果你业务代码中确实是调用MemberApi.addMember()静态方法,需要替换依赖为Mockito-inline实现静态Mock:

  1. 替换依赖
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
  1. 测试逻辑调整
@Test
public void testStaticAddMember() {
    NewMember mockReturnMember = new NewMember();
    mockReturnMember.setId(123L);
    // Mock静态方法
    try(MockedStatic<MemberApi> mockedStatic = Mockito.mockStatic(MemberApi.class)) {
        mockedStatic.when(() -> MemberApi.addMember(any(CreateMemberParameterObj.class))).thenReturn(mockReturnMember);
        // 执行业务方法测试
        NewMember result = businessService.你的业务方法();
        assertNotNull(result);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:18:02