@MockBean配合@SpringBootTest(webEnvironment = WebEnvironment.NONE)可精准替换依赖Bean,保留Spring容器能力且不启动Web层或数据库,支持行为模拟与交互验证。

直接用 @MockBean + @Autowired 组合,配合 @SpringBootTest 的轻量模式,就能在保留 Spring 容器能力的同时,精准控制依赖行为——不启动 Web 层、不连数据库,只加载 Service 及其直接依赖。
用 @MockBean 替换真实 Bean,而不是手动 new 对象
Service 类往往依赖 Repository、其他 Service 或外部客户端。如果在测试里 new 一个对象再 set 依赖,就绕过了 Spring 的生命周期管理,也失去了 AOP(比如事务、日志)的验证机会。
正确做法是让 Spring 管理被测 Service,再用 @MockBean 替换它需要的协作对象:
-
@MockBean会把 Mock 实例注册进测试上下文,自动覆盖同类型的已有 Bean - 它支持重复使用,多次
@MockBean同一个类型时,后声明的会覆盖前一个 - 每次测试方法执行完,Mock 状态自动重置(除非显式用
@DirtiesContext)
避免全量启动,用 webEnvironment = WebEnvironment.NONE
@SpringBootTest 默认会尝试加载 Web 环境,哪怕你只测 Service,也会触发 Tomcat 初始化、静态资源扫描等冗余步骤,拖慢测试速度。
加一行配置即可精简上下文:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
这样只加载 Spring 核心容器和你项目中定义的 Bean,跳过所有 Web 相关自动配置,单个测试通常在 200–500ms 内完成。
按需模拟返回值,覆盖正常与异常分支
Mockito 不只是“让方法不报错”,关键是模拟不同业务场景下的协作行为。比如订单创建逻辑依赖支付服务:
- 支付成功 → 验证订单状态为“已支付”
- 支付超时 → 验证抛出特定业务异常,且订单回滚(若含事务)
- 第三方返回“余额不足” → 验证记录失败原因并触发补偿流程
写法示例:
when(paymentClient.invoke(eq("ORDER-001"))).thenReturn(PaymentResult.success("TXN-999"));<br>when(paymentClient.invoke(eq("ORDER-002"))).thenThrow(new PaymentTimeoutException());
别忘了验证交互,不只是断言结果
单元测试不仅要检查“输出对不对”,还要确认“有没有按预期调用依赖”。比如一个发券服务,应只在用户满足条件时才调短信客户端:
- 用
verify(smsClient, times(1)).send(...)确认调用了一次 - 用
verify(smsClient, never()).send(...)确保不满足条件时不触发 - 搭配
ArgumentCaptor检查传入参数是否符合业务规则(如手机号格式、模板 ID 是否正确)
这种“行为验证”比单纯检查返回值更能守住逻辑边界。

















