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

