SKILL.md
readonly只读
name
java-junit
description
获取 JUnit 5 单元测试的最佳实践,包括数据驱动测试
JUnit 5+ 最佳实践
你的目标是帮助我使用 JUnit 5 编写有效的单元测试,涵盖标准测试和数据驱动测试方法。
项目设置
- 使用标准的 Maven 或 Gradle 项目结构。
- 将测试源代码放在
src/test/java目录下。 - 包含
junit-jupiter-api、junit-jupiter-engine和junit-jupiter-params依赖,以支持参数化测试。 - 使用构建工具命令运行测试:
mvn test或gradle test。
测试结构
- 测试类应以
Test结尾,例如Calculator类的测试类命名为CalculatorTest。 - 使用
@Test标记测试方法。 - 遵循 Arrange-Act-Assert (AAA) 模式。
- 使用描述性约定命名测试,例如
methodName_should_expectedBehavior_when_scenario。 - 使用
@BeforeEach和@AfterEach进行每个测试的初始化和清理。 - 使用
@BeforeAll和@AfterAll进行每个类的初始化和清理(必须是静态方法)。 - 使用
@DisplayName为测试类和测试方法提供可读的名称。
标准测试
- 保持测试专注于单一行为。
- 避免在一个测试方法中测试多个条件。
- 使测试独立且幂等(可以以任意顺序运行)。
- 避免测试之间的依赖。
数据驱动(参数化)测试
- 使用
@ParameterizedTest标记方法为参数化测试。 - 使用
@ValueSource提供简单的字面量值(字符串、整数等)。 - 使用
@MethodSource引用一个工厂方法,该方法以Stream、Collection等形式提供测试参数。 - 使用
@CsvSource提供内联逗号分隔值。 - 使用
@CsvFileSource使用类路径下的 CSV 文件。 - 使用
@EnumSource使用枚举常量。
断言
- 使用
org.junit.jupiter.api.Assertions中的静态方法(例如assertEquals、assertTrue、assertNotNull)。 - 为了更流畅和可读的断言,可以考虑使用 AssertJ 等库(
assertThat(...).is...)。 - 使用
assertThrows或assertDoesNotThrow测试异常。 - 使用
assertAll分组相关断言,确保所有断言在测试失败前都被检查。 - 在断言中使用描述性消息,以便在失败时提供清晰的信息。
模拟与隔离
- 使用 Mockito 等模拟框架为依赖创建模拟对象。
- 使用 Mockito 的
@Mock和@InjectMocks注解简化模拟对象的创建和注入。 - 使用接口以便于模拟。
测试组织
- 按功能或组件使用包对测试进行分组。
- 使用
@Tag对测试进行分类(例如@Tag("fast")、@Tag("integration"))。 - 在必要时使用
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)和@Order控制测试执行顺序。 - 使用
@Disabled临时跳过测试方法或类,并提供原因。 - 使用
@Nested在嵌套内部类中对测试进行分组,以实现更好的组织和结构。






