微服务项目的测试最容易变重:一跑测试就要 Nacos、MySQL、网络和一堆环境变量。这个项目的原则是绝大多数测试不启动完整应用,也不依赖外部组件,让
mvn test 可以在本机随手执行。
一、测试栈
项目使用:
JUnit 5
Mockito
AssertJ
Spring Test
普通业务逻辑用 Mockito 隔离依赖;和自动装配相关的公共组件用轻量级 ContextRunner 验证,不起完整服务。
二、命名让失败自己会说话
测试类按 被测类名 + Test 命名,方法使用 test + 行为描述:
UserControllerTest#testGetUserReturnsDto
OrderServiceImplTest#testSaveWithDetailsRollsBackWhenDetailSaveFails
看到失败名字,就应该大概知道哪个契约被打破。
三、测行为,不测实现细节
比如订单事务测试关注的不是 MyBatis-Plus 内部怎么执行,而是:
- 主表保存成功、明细保存失败时抛出异常。
- 明细写入前会补齐订单 ID 和订单号。
- 删除订单时会同时删除明细。
这种测试在重构实现时仍然有效。
四、Mock 要有边界
适合 Mock 的是外部协作对象:Mapper、远程 Feign 客户端、邮件发送器。不要把被测对象自己 Mock 掉,也不要为了凑覆盖率测试 getter 和 setter。
五、经验总结
单元测试的价值来自快、稳定、指向清楚。需要真实数据库和网络的验证放到集成或环境测试里,不要混进每次提交都跑的基础测试。