在上一篇文章中,我們介紹了 JUnit 的基本概念與安裝配置。本文將深入實戰,示範如何在 Eclipse 中針對一個具體的 Java 應用程式撰寫並執行單元測試,涵蓋測試類的建立、測試方法的實作、常見錯誤的排查以及測試獨立性的重要觀念。
假設我們有一個名為 JN_test 的應用程式類別,包含 allocate()、set()、get() 三個待測方法。在 Eclipse 的 Package Explorer 中,右鍵點擊該類別所在的專案或套件,選擇 New → Other,在對話框中展開 Java 節點,選擇 JUnit → JUnit Test Case,點擊 Next。
被測類別名 + Test,例如 JN_testTest。setUp() 和 tearDown()。這兩個方法分別在每個測試方法執行前後自動被呼叫,用於建立與清理測試所需的資料或物件(JUnit 術語稱為 fixtures)。allocate、set、get,JUnit 將自動產生對應的測試方法存根:testAllocate()、testSet()、testGet()。package net.csdn.blog;
import junit.framework.TestCase;
public class JN_testTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testAllocate() { }
public void testGet() { }
public void testSet() { }
}
由於三個測試方法都需要呼叫 JN_test 的實例方法,我們在 setUp() 中初始化一個欄位 testObject:
private JN_test testObject;
protected void setUp() throws Exception {
super.setUp();
testObject = new JN_test();
}
allocate() 回傳的陣列不為 null。
public void testAllocate() {
assertNotNull(testObject.allocate());
}
get(index) 回傳預期值。
public void testGet() {
assertEquals(testObject.get(1), 1);
}
set(index, value) 成功時回傳 true。
public void testSet() {
assertTrue(testObject.set(2, 4));
}
在 Package Explorer 中右鍵點擊 JN_testTest,選擇 Run As → JUnit Test。JUnit 視圖顯示紅色進度條,三個測試全部失敗(打叉)。
檢視 testAllocate 的堆疊追蹤,發現 allocate() 方法本體為空,導致回傳 null。修正 JN_test.allocate():
public int[] allocate() {
array = new int[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;
return array;
}
再次執行,testAllocate 通過(綠燈),但 testGet 和 testSet 仍失敗。
這是 JUnit 設計的關鍵特性:**每個測試方法都在獨立的環境中執行**。雖然 testAllocate 呼叫了 allocate() 初始化陣列,但這個動作並不會影響後續的 testGet 和 testSet。它們各自擁有全新的 testObject(因為 setUp() 會在每個測試前重新執行),陣列尚未被初始化。
public void testGet() {
testObject.allocate(); // 明確初始化
assertEquals(testObject.get(1), 1);
}
public void testSet() {
testObject.allocate(); // 明確初始化
assertTrue(testObject.set(2, 4));
}
JUnit 視圖頂部進度條轉為綠色,三個測試全部通過。
setUp()/tearDown() 在**每個**測試方法前後各執行一次,而非整個測試類別只執行一次。掌握這些核心觀念,即能在 Eclipse 中高效地撰寫、維護高品質的單元測試,為專案品質把關。