java-junit

java-junit

热门

获取 JUnit 5 单元测试的最佳实践,包括数据驱动测试

3.6万Star
0Fork
更新于 2026/7/11
SKILL.md
readonly只读
name
java-junit
description

获取 JUnit 5 单元测试的最佳实践,包括数据驱动测试

JUnit 5+ 最佳实践

你的目标是帮助我使用 JUnit 5 编写有效的单元测试,涵盖标准测试和数据驱动测试方法。

项目设置

  • 使用标准的 Maven 或 Gradle 项目结构。
  • 将测试源代码放在 src/test/java 目录下。
  • 包含 junit-jupiter-apijunit-jupiter-enginejunit-jupiter-params 依赖,以支持参数化测试。
  • 使用构建工具命令运行测试:mvn testgradle test

测试结构

  • 测试类应以 Test 结尾,例如 Calculator 类的测试类命名为 CalculatorTest
  • 使用 @Test 标记测试方法。
  • 遵循 Arrange-Act-Assert (AAA) 模式。
  • 使用描述性约定命名测试,例如 methodName_should_expectedBehavior_when_scenario
  • 使用 @BeforeEach@AfterEach 进行每个测试的初始化和清理。
  • 使用 @BeforeAll@AfterAll 进行每个类的初始化和清理(必须是静态方法)。
  • 使用 @DisplayName 为测试类和测试方法提供可读的名称。

标准测试

  • 保持测试专注于单一行为。
  • 避免在一个测试方法中测试多个条件。
  • 使测试独立且幂等(可以以任意顺序运行)。
  • 避免测试之间的依赖。

数据驱动(参数化)测试

  • 使用 @ParameterizedTest 标记方法为参数化测试。
  • 使用 @ValueSource 提供简单的字面量值(字符串、整数等)。
  • 使用 @MethodSource 引用一个工厂方法,该方法以 StreamCollection 等形式提供测试参数。
  • 使用 @CsvSource 提供内联逗号分隔值。
  • 使用 @CsvFileSource 使用类路径下的 CSV 文件。
  • 使用 @EnumSource 使用枚举常量。

断言

  • 使用 org.junit.jupiter.api.Assertions 中的静态方法(例如 assertEqualsassertTrueassertNotNull)。
  • 为了更流畅和可读的断言,可以考虑使用 AssertJ 等库(assertThat(...).is...)。
  • 使用 assertThrowsassertDoesNotThrow 测试异常。
  • 使用 assertAll 分组相关断言,确保所有断言在测试失败前都被检查。
  • 在断言中使用描述性消息,以便在失败时提供清晰的信息。

模拟与隔离

  • 使用 Mockito 等模拟框架为依赖创建模拟对象。
  • 使用 Mockito 的 @Mock@InjectMocks 注解简化模拟对象的创建和注入。
  • 使用接口以便于模拟。

测试组织

  • 按功能或组件使用包对测试进行分组。
  • 使用 @Tag 对测试进行分类(例如 @Tag("fast")@Tag("integration"))。
  • 在必要时使用 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)@Order 控制测试执行顺序。
  • 使用 @Disabled 临时跳过测试方法或类,并提供原因。
  • 使用 @Nested 在嵌套内部类中对测试进行分组,以实现更好的组织和结构。