企业级Java单元测试需严格遵循AIR原则、覆盖率基线及命名规范:Automatic(自动化执行)、Independent(独立无状态)、Repeatable(结果一致);覆盖Service等业务类,行覆盖≥80%、核心模块分支覆盖100%;禁用@SpringBootTest,坚持AAA模式与@Mock隔离。

企业级 Java 项目中,单元测试不是“写了就行”,而是有明确标准、可度量、可落地的质量防线。核心在于用规范约束行为,用工具保障执行,用流程嵌入研发节奏。
必须遵守的 AIR 原则
这是所有规范的起点,强制执行:
- Automatic(自动化):测试全部通过 Maven 或 IDE 一键触发,不依赖人工点击或 System.out 输出;断言必须用 Assertions 或 AssertJ,禁止“肉眼验证”
- Independent(独立性):每个 @Test 方法互不干扰,不共享状态、不依赖执行顺序;避免在测试类中用 static 变量缓存数据或复用 mock 对象
- Repeatable(可重复):无论本地、CI 还是不同时间运行,结果一致;禁止读取系统时间、随机数、配置文件、数据库或网络接口
测试范围与覆盖率基线
不是“能测的都测”,而是聚焦高价值逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 必须覆盖的类:Service、Converter、Validator、Util、Domain Service 等含业务规则的类;DAO 层不在此列(归集成测试)
- 行覆盖率 ≥ 80% 是团队准入门槛,核心模块(如支付、风控)要求分支覆盖率 100%
- 拒绝“伪覆盖”:只调用方法但不验证返回值、不校验异常路径、跳过 null/empty/边界输入,不算有效覆盖
命名与结构规范
让测试本身成为可读文档:
立即学习“Java免费学习笔记(深入)”;
- 测试类名 = 被测类名 + Test(如 UserService → UserServiceTest)
- 测试方法名 = 动词_条件_预期结果(如 getUserById_whenIdIsNull_shouldThrowIllegalArgumentException)
- 目录结构严格镜像 src/main/java:test/java/com/example/user/UserServiceTest.java
技术实践红线
哪些事绝对不能做,直接决定测试是否“企业级”:
- 禁用 @SpringBootTest 和 @Autowired 做纯单元测试;要用 @Mock 和 @InjectMocks 隔离依赖
- 禁止在单元测试中启动 H2、连接 Redis、调用 RestTemplate;这些属于集成测试范畴
- 不 mock 被测类本身,不 mock 静态方法(除非重构成本极高且已引入 Pitest 验证有效性)
- 每个测试方法必须遵循 AAA 模式:Arrange(准备)、Act(执行)、Assert(断言),逻辑清晰可追溯

















