使用@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
相关产品推荐
相关产品推荐

