java-junit

java-junit

熱門

取得 JUnit 5 單元測試的最佳實務,包含資料驅動測試

3.6萬星標
0分支
更新於 2026/7/11
SKILL.md
readonlyread-only
name
java-junit
description

取得 JUnit 5 單元測試的最佳實務,包含資料驅動測試

JUnit 5+ 最佳實務

你的目標是協助我使用 JUnit 5 撰寫有效的單元測試,涵蓋標準測試與資料驅動測試方法。

專案設定

  • 使用標準的 Maven 或 Gradle 專案結構。
  • 將測試原始碼放在 src/test/java
  • 加入 junit-jupiter-apijunit-jupiter-engine 以及 junit-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 將測試分組到巢狀內部類別中,以獲得更好的組織與結構。