Spring Boot 3.1中@MockBean无法Mock类的问题咨询
问题原因分析
这个问题的核心原因是Spring Boot 3.x 升级后,Mockito 默认不再支持 Mock 最终类(final class),你的AuditService2大概率是一个没有实现接口的最终类。
具体细节:
- Spring Boot 2.x 版本中,
spring-boot-test-autoconfigure会自动配置 Mockito 的inline-mock-maker,允许 Mock 最终类、方法以及静态方法。 - 升级到 Spring Boot 3.x 后,这个默认配置被移除了。Mockito 默认使用
subclass-mock-maker,只能 Mock 非最终类和接口——这就是为什么作为接口的AuthorizationManager能被正常 Mock,而AuditService2(如果是 final 类)会被注入真实 Bean 的原因。
另外还有一种小概率情况:如果AuditService2的 Bean 是通过自定义@Bean方法注册,且该方法带有@Conditional相关注解,可能导致@MockBean无法正确替换原 Bean,但这种场景远不如 final 类的情况常见。
解决办法
- 方法一:给
AuditService2定义对应接口,让类实现该接口,测试中 Mock 对应的接口(推荐,符合面向接口编程规范)。 - 方法二:开启 Mockito 的 inline mock maker 支持:
- 在测试资源目录下创建
mockito-extensions文件夹 - 新建文件
org.mockito.plugins.MockMaker,文件内容写入:mock-maker-inline
- 在测试资源目录下创建
内容的提问来源于stack exchange,提问作者Deibys
相关产品推荐
相关产品推荐

