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

Mockito Mock在JUnit/Spring Boot测试后未重置,clearInvocations无效

问题分析与解决方案

问题原因

使用@MockBean创建的Mock实例属于测试类级别,多个测试方法会共享同一Mock对象,导致前一个测试的交互记录会残留到下一个测试中。此外,clearInvocations()仅清除交互记录的临时缓存,无法彻底重置Mock的状态,因此无法解决跨测试的交互残留问题。同时需要优先确认:错误日志显示业务逻辑在testJsonPayload场景下实际调用了AdapterY,需先排查业务代码是否符合"每次仅一个Adapter执行"的预期。

解决步骤

1. 重置Mock实例(推荐)

在测试类中添加@BeforeEach方法,使用Mockito.reset()在每个测试方法执行前彻底重置所有MockBean,清除所有历史交互记录:

import static org.mockito.Mockito.reset;

// ... 其他导入和测试类代码 ...

@BeforeEach
void setUp() {
    reset(adapterX, adapterY, adapterZ);
}

2. 排查业务逻辑正确性

根据错误日志提示,MessageValidationImpl.java:61处调用了AdapterY,需检查该业务方法的逻辑:在testJsonPayload对应的场景下,是否误触发了AdapterY的调用,确保只有AdapterX被执行。

备选方案(不推荐)

若重置Mock无法解决,可使用@DirtiesContext注解标记测试类,强制Spring在每个测试方法后重建上下文。但该方案会显著增加测试耗时,仅在极端场景下使用:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {MessageValidationImplTest.TestConfig.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
class MessageValidationImplTest {
    // ... 测试代码 ...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:35:21