🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx @anthropic-ai/skills install github/awesome-copilot/java-junit

💡 提示:需要 Node.js 和 NPM

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 将测试组织在嵌套的内部类中,以获得更好的组织和结构。

📄 原始文档

完整文档(英文):

https://skills.sh/github/awesome-copilot/java-junit

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。