JUnit 4.4 (2007 年釋出) 引入三大核心功能,旨在更精準捕捉開發者意圖:
assertThat(整合 Hamcrest Matcher)AssumptionTheory傳統 assertEquals 等方法語意單一、語法呈「謂賓主」順序(如 assertEquals(3, x)),且錯誤訊息不易理解。assertThat 採「主謂賓」自然語序:
assertThat(x, is(3));
結合 Hamcrest Matcher 可表達複雜條件:
anyOf(containsString("dev"), containsString("Works")) — 邏輯 ORallOf(greaterThan(8), lessThan(16)) — 邏輯 ANDnot(equalTo("dev")) — 否定優勢:單一斷言取代所有舊 API、錯誤訊息自動具描述性(如 Expected: (a string containing "dev" or ...))、支援自訂 Matcher 復用邏輯。
測試環境差異(如 Locale、缺少資源)導致測試失敗卻非測試本意。assumeThat 讓測試在前置條件不滿足時「靜默通過」並跳過後續斷言:
@Test
public void testAssumptions() {
assumeThat(i, is(10)); // 不滿足則直接跳出此測試方法
System.out.println("assumption is true!");
}
應用場景:長時間測試僅在特定環境變數下執行、依賴外部服務的測試。
TDD 單一測試案例難以覆蓋無限輸入組合。Theory 讓開發者以「理論」陳述普遍行為,搭配 @DataPoint 提供資料集,JUnit 自動產生所有參數組合:
@RunWith(Theories.class)
public class TheoryTest {
@DataPoint public static String YEAR_2007 = "2007";
@DataPoint public static String NAME1 = "developer";
@Theory
public void testNames(String year, String name) {
assumeThat(year, is("2007")); // 過濾資料
assertThat(year, is("2007"));
}
}
結合 Assumption 可精準控制實際執行的資料子集。自動化工具可進一步擴大資料點發現邊界錯誤。
JUnit 4.4 讓測試代碼更簡潔、表達力更強、維護成本更低,建議遷移既有專案並善用三大新特性。