Java独立测试用例需确保方法互不干扰、可重复执行、只验证单一行为,关键在于隔离依赖、避免共享状态、合理使用@Test/@BeforeEach/@AfterEach、Mockito模拟外部组件、具体断言。

Java 中编写独立的测试用例,核心是让每个测试方法互不干扰、可重复执行、只验证单一行为。关键在于隔离被测代码的外部依赖、避免共享状态、使用合适的测试生命周期管理。
用 @Test 标记单个测试方法
每个测试方法必须是 public、无返回值(void)、无参数,并用 @Test 注解标记。JUnit 5 中无需继承特定类或遵循命名约定,方法名建议语义化,例如 shouldReturnTrueWhenInputIsPositive()。
- 一个类中可以有多个 @Test 方法,它们默认并行执行(需显式禁用并发以保安全)
- 不要在测试方法间传递数据或依赖执行顺序——JUnit 不保证执行顺序
- 避免在测试方法中调用 System.exit()、修改静态变量、写文件等破坏性操作
用 @BeforeEach 和 @AfterEach 隔离测试状态
每个测试前重置环境,每个测试后清理资源,确保独立性。例如重新创建被测对象、清空集合、关闭模拟对象等。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- @BeforeEach 方法在每个 @Test 前执行,适合初始化新实例(如 new Calculator())
- @AfterEach 方法在每个 @Test 后执行,适合释放资源(如关闭 MockMvc、重置 Mockito 静态 mock)
- 避免在 @BeforeAll / @AfterAll 中修改共享可变状态(如 static List),否则会污染其他测试
用 Mockito 或手动模拟替代真实依赖
独立测试要求不依赖数据库、网络、文件系统等外部组件。用 mock 对象替换协作类,控制输入输出,聚焦逻辑本身。
立即学习“Java免费学习笔记(深入)”;
- 用 Mockito.mock() 创建模拟对象,when(...).thenReturn(...) 设定行为
- 用 @Mock + @ExtendWith(MockitoExtension.class) 简化 mock 管理(JUnit 5)
- 避免在测试中 new 出真实服务(如 new UserServiceImpl(new JdbcUserDao())),这会让测试变得脆弱且不独立
断言要具体、失败时信息明确
用 Assertions.assertEquals()、assertTrue() 等静态方法校验结果。优先使用带消息参数的重载版本,便于快速定位问题。
- 不要只写 assertThat(result).isNotNull(),而应明确预期值:assertEquals(42, result.getAge(), "年龄应为42")
- 对异常测试,用 assertThrows() 捕获并验证异常类型和消息
- 避免在测试中使用 System.out.println() 或日志代替断言——那不是验证,只是观察

















