用途:帮助编写基于 JUnit 5 的有效单元测试,兼顾标准测试与数据驱动测试。
项目设置:使用标准 Maven 或 Gradle 项目结构,测试代码放在 src/test/java;引入 junit-jupiter-api、junit-jupiter-engine 以及用于参数化测试的 junit-jupiter-params 依赖;用 mvn test 或 gradle test 运行测试。
测试结构:测试类以 Test 结尾(如 CalculatorTest);用 @Test 标注测试方法;遵循 Arrange-Act-Assert(AAA)模式;命名采用 methodName_should_expectedBehavior_when_scenario 之类的描述性约定;用 @BeforeEach、@AfterEach 做每个测试的准备与清理,用 @BeforeAll、@AfterAll 做类级别准备与清理(须为静态方法);用 @DisplayName 提供可读名称。
标准测试:每个测试聚焦单一行为,避免一个方法测多个条件;测试应独立且幂等,可任意顺序运行,避免相互依赖。
数据驱动测试:用 @ParameterizedTest 标记参数化测试;@ValueSource 提供简单字面量,@MethodSource 引用返回 Stream、Collection 等的工厂方法,@CsvSource 提供内联逗号分隔值,@CsvFileSource 读取 classpath 上的 CSV 文件,@EnumSource 使用枚举常量。
断言:使用 org.junit.jupiter.api.Assertions 的静态方法(如 assertEquals、assertTrue、assertNotNull);可考虑 AssertJ 等库获得更流畅可读的断言;用 assertThrows 或 assertDoesNotThrow 测试异常;用 assertAll 分组相关断言,确保失败前检查全部断言;断言中可加描述性消息。
Mock 与隔离:使用 Mockito 等框架创建依赖的 mock 对象,用 @Mock 和 @InjectMocks 简化创建与注入,使用接口便于 mock。
测试组织:按功能或组件用包分组;用 @Tag 分类(如 @Tag("fast")、@Tag("integration"));必要时用 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 与 @Order 控制执行顺序;用 @Disabled 并附原因临时跳过测试方法或类;用 @Nested 在嵌套内部类中分组测试。
限制:资料未提供具体版本要求、完整依赖坐标、示例代码或收费信息。