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

使用@InjectMocks注解时Mockito测试verify校验失败问题咨询

问题背景

在为SpringBoot应用编写基于Mockito的单元测试时,最初选择@InjectMocks实现依赖注入,该方式写法简洁清晰,初始测试类代码如下:

@ExtendWith(MockitoExtension.class)
public class MyTests {

    @InjectMocks      
    private MyService service;

    @Mock
    private Producer<String, RequestMessage> producer1;

    @Mock
    private Producer<String, RequestResult> producer2;
    // 其余依赖声明
}

被测业务逻辑包含两个核心流程:

  • 正常流程:通过producer1创建并发送请求
  • 异常流程:当请求创建出现校验失败时,通过producer2发送失败消息

单元测试需要校验不同场景下被调用的是正确的producer,对应的测试用例代码如下:

@Test
void start_ValidData_ShouldCreateMessageAndSendIt() throws Exception {
  // 测试逻辑省略

  verify(producer1).send(customerEmail, message);
}

@Test
void start_DataIsNotPassingValidation_ShouldSendFailureResponse() throws Exception {
  // 测试逻辑省略

  verify(producer1, never()).send(any(), any());
  verify(producer2).send(
                    argThat(message -> message.getResultStatus() == FAILED_IN_PARSE));        
}
问题现象

单独运行任意一个测试用例时都可以正常通过,但运行整个测试类时会在verify校验行报错,且每次报错的测试用例不固定。
通过添加日志、断点调试确认,代码实际执行流程完全符合预期,最初推测是两个异步测试用例并发调用共享的Mock Producer实例,导致verify校验失败。
后续改用显式调用构造方法注入依赖的方式,问题得到解决,调整后的初始化代码如下:

@BeforeEach
public void initMocks() {
    producer1 = Mockito.mock(Producer.class);
    producer2 = Mockito.mock(Producer.class);
    // 其余Mock对象初始化

    service = new MyService(producer1,
            producer2 /* 其余依赖传入 */);
}
待解疑问

为什么使用@InjectMocks注解时测试会出现校验失败的问题?

补充说明:已确认每次测试运行时producer实例都会重新初始化,且即便实例未重新初始化,首个执行的测试用例也应当正常通过。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:12:19