微服务单元测试要轻得能随手跑

zjc 于 2026-08-07 发布

微服务项目的测试最容易变重:一跑测试就要 Nacos、MySQL、网络和一堆环境变量。这个项目的原则是绝大多数测试不启动完整应用,也不依赖外部组件,让 mvn test 可以在本机随手执行。

一、测试栈

项目使用:

JUnit 5
Mockito
AssertJ
Spring Test

普通业务逻辑用 Mockito 隔离依赖;和自动装配相关的公共组件用轻量级 ContextRunner 验证,不起完整服务。

二、命名让失败自己会说话

测试类按 被测类名 + Test 命名,方法使用 test + 行为描述

UserControllerTest#testGetUserReturnsDto
OrderServiceImplTest#testSaveWithDetailsRollsBackWhenDetailSaveFails

看到失败名字,就应该大概知道哪个契约被打破。

三、测行为,不测实现细节

比如订单事务测试关注的不是 MyBatis-Plus 内部怎么执行,而是:

这种测试在重构实现时仍然有效。

四、Mock 要有边界

适合 Mock 的是外部协作对象:Mapper、远程 Feign 客户端、邮件发送器。不要把被测对象自己 Mock 掉,也不要为了凑覆盖率测试 getter 和 setter。

五、经验总结

单元测试的价值来自快、稳定、指向清楚。需要真实数据库和网络的验证放到集成或环境测试里,不要混进每次提交都跑的基础测试。