Spring Boot测试中使用@MockBean如何开启Mockito严格校验模式
解决方案
你遇到的问题本质是@MockBean默认创建的Mockito Mock使用宽松 stubbing 模式,而MockitoExtension默认启用的是严格 stubbing 模式,所以校验逻辑不一致,以下是三种可行的配置方案:
方案1:全局启用严格Stubbing模式(推荐,一劳永逸)
在测试类路径下(一般是src/test/resources)新建mockito.properties配置文件,添加如下配置:
org.mockito.stubbing.defaultStrictness=STRICT_STUBS
配置后所有由Spring创建的@MockBean、以及普通Mockito Mock都会默认启用严格模式,和MockitoExtension的默认行为完全一致。
方案2:单个测试类启用严格模式
如果不想全局修改影响其他测试用例,可以在需要开启严格校验的测试类上添加@MockitoSettings注解:
import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest @MockitoSettings(strictness = Strictness.STRICT_STUBS) class MyServiceTest { @MockBean MyDependency myDependency; @Autowired MyService myService; @Test void execute() { given(myDependency.execute("arg0")).willReturn(4); myService.execute("arg1"); // 会抛出PotentialStubbingProblem异常 } }
该配置仅对当前测试类内的所有Mock生效。
方案3:单个MockBean单独指定严格模式
如果只需要给特定的@MockBean开启严格校验,直接在注解上配置strictness属性即可(Spring Boot 2.2+ 版本支持):
@SpringBootTest class MyServiceTest { @MockBean(strictness = Mock.Strictness.STRICT_STUBS) MyDependency myDependency; // 其他代码不变 }
该配置仅对当前声明的MockBean生效,不影响其他Mock。
效果验证
配置完成后,之前的测试场景会触发和单元测试完全一致的异常:
- Stub参数不匹配抛出
PotentialStubbingProblem - 未使用的Stub抛出
UnnecessaryStubbingException
注意事项
如果项目中存在历史测试用例依赖宽松模式的返回逻辑,建议优先使用方案2或方案3做局部适配,避免全局配置导致大量历史用例运行失败。
内容的提问来源于stack exchange,提问作者Joseph K. Strauss
相关产品推荐
相关产品推荐

