單元測試是保證代碼質量、重構安全網的基石。本文涵蓋測試分類、JUnit 核心 API、測試組織、IDE 集成、最佳實踐,助你建立測試驅動開發習慣。
| 註解 | 執行時機 | 用途 |
|---|---|---|
| @BeforeClass | 類加載前一次 | 昂貴資源初始化(DB 連接池) |
| @Before | 每個 @Test 前 | 通用 fixture 構建 |
| @Test | 測試方法 | 核心驗證邏輯 |
| @After | 每個 @Test 後 | 資源清理 |
| @AfterClass | 類卸載後一次 | 釋放昂貴資源 |
| @Ignore | 跳過 | 暫時禁用測試 |
assertEquals(expected, actual); // 等值
assertEquals(expected, actual, delta); // 浮點數容差
assertTrue(condition); assertFalse(condition);
assertNull(obj); assertNotNull(obj);
assertSame(expected, actual); // 同一引用
assertArrayEquals(expected, actual); // 數組
fail("message"); // 強制失敗
@RunWith(Parameterized.class)
public class MathTest {
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{{1,2,3},{2,3,5}});
}
private int a,b,expected;
public MathTest(int a,int b,int expected){this.a=a;this.b=b;this.expected=expected;}
@Test public void testAdd(){ assertEquals(expected, a+b); }
}
// 異常測試
@Test(expected = IllegalArgumentException.class)
public void testInvalidInput() { obj.method(null); }
// JUnit 5 斷言異常
assertThrows(IllegalArgumentException.class, () -> obj.method(null));
mvn test 自動掃描 src/test/java 下 *Test.java。methodName_condition_expectedResult。單元測試不是負擔,而是開發加速器。從今天開始,為每個新功能寫第一個測試,再寫實現代碼。JUnit 5 已成主流,建議新項目直接上手 Jupiter API(@BeforeEach、@DisplayName、assertAll 等現代特性)。