JUnit 5 / TestNG 提供:註解驅動、參數化測試、分組/忽略、建構工具整合 (Maven/Gradle)。
輔以 Mockito/EasyMock 模擬外部依賴 (DAO、Service),隔離被測單元。
if (flag) { ... } return result.toLowerCase(); 測 true 分支覆蓋 100%,但 false 會拋 NPE。避免硬編碼測試資料。JUnit 5 @ParameterizedTest + @CsvSource / @MethodSource;TestNG @DataProvider / testng.xml。支援從 CSV/JSON/DB 讀取。
// 差:需人工看 console
@Test void bad() { System.out.println(util.concat("a","b")); }
// 好:自動判定成功/失敗
@Test void good() { assertEquals("ab", util.concat("a","b")); }
斷言失敗會拋出 AssertionError,CI/CD 直接標紅。
避免依賴隨機數、當前時間、網路、檔案系統。對不可控依賴使用 Mock/Stub 固定回傳值。
Thread.sleep(random) → Mock 時間源或傳入固定延遲。
1~100 測試 0,1,100,101;集合測試空、單元素、大量。assertThrows(IllegalArgumentException.class, () -> ...)。優質單元測試 = 正確性保障 + 重構安全網 + 活文檔。投資測試即投資軟體長期可維護性。