Java单元测试实战以“边做边学、小步验证、闭环反馈”为核心,从可测小功能入手,用JUnit 5写三类场景测试(正常/边界/异常),逐步引入Mockito解耦依赖,使测试成为开发节奏的一部分。

Java单元测试实战演练项目,核心是“边做边学、小步验证、闭环反馈”。它不是先写完所有业务代码再补测试,而是以一个具体、可运行的小功能为起点,用测试驱动的方式把单元测试能力真正练出来。
选一个真实可测的业务功能
别从“用户管理”这种大模块入手。挑一个逻辑清晰、依赖明确、有输入输出的小单元,比如:
- 订单金额计算工具类中的
calculateFinalAmount()方法 - 登录密码校验服务里的
isValidPassword(String)方法 - 字符串工具类中带空格处理的
trimAndCapitalize()方法
关键是要能一眼看出“给什么输入,该返回什么”,且不强依赖数据库、HTTP调用等外部资源。
用JUnit 5搭起第一个可运行的测试骨架
在IDEA里右键对应类 → Go to → Test → 选择JUnit 5,自动生成测试类。确保pom.xml已含基础依赖:
立即学习“Java免费学习笔记(深入)”;
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency>
写一个最简测试方法,只验证一个确定结果:
@Test
void shouldReturnCorrectAmountWhenDiscountApplied() {
double result = orderCalculator.calculateFinalAmount(100.0, 10.0);
assertEquals(90.0, result, 0.01); // 注意浮点数比较用delta
}
覆盖三类典型场景:正常、边界、异常
一个合格的实战练习,必须包含这三类用例,不能只测“能跑通”:
- 正常场景:合法输入,验证预期输出(如金额100元减10元得90元)
- 边界场景:最小值、最大值、零值、空字符串(如优惠券为0、金额为负数、折扣率超100%)
-
异常场景:主动触发并验证异常(如传入null参数时是否抛
IllegalArgumentException)
异常测试推荐用JUnit 5的@Test(expected = ...)或更灵活的assertThrows()方式,比try-catch更简洁可靠。
逐步引入Mockito处理依赖
当被测方法开始调用其他类(比如调用UserRepository查用户信息),就进入实战进阶环节:
- 用
@Mock声明模拟对象 - 用
when(mock.method()).thenReturn(...)设定行为 - 用
verify(mock).method()确认是否被正确调用
例如测试“根据用户等级返回折扣率”,只需mock掉userRepository.findById(),让它返回一个预设等级的用户,而不连接真实数据库。
让测试真正成为开发节奏的一部分
完成几个核心方法的测试后,做三件事巩固效果:
- 在IDEA里按
Ctrl+Shift+F10一键运行整个测试类,感受秒级反馈 - 改一行被测代码(比如把折扣率从0.05改成0.08),看对应测试是否立刻失败
- 提交前执行
mvn test,确保本地CI流程能走通
测试不是附加任务,它是你每次保存代码后自动运行的“第二双眼睛”。练到这个程度,实战才算真正落地。


















