SKILL.md
readonlyread-only
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將測試分組到巢狀內部類別中,以獲得更好的組織與結構。






