| 特性 | JUnit | J2ME Unit |
| 測試發現 | 反射自動掃描 | 手動編寫 suite() 註冊每個測試 |
| TestCase 與 TestMethod | 一個 TestCase 可含多測試方法 | 一個 TestCase 實例僅綁定一個 TestMethod |
| 執行入口 | TestRunner 自動執行 | TextUI / MidletUI 兩種模式 |
環境搭建
- 下載
j2meunit.jar:SourceForge
- Eclipse + EclipseME 專案 → Properties → Java Build Path → Libraries → Add External JARs → 選擇 jar
編寫測試類
1. 測試類模板
import j2meunit.framework.*;
public class MathTest extends TestCase {
// 必須提供雙參構造函數綁定 TestMethod
public MathTest(String name, TestMethod method) {
super(name, method);
}
// 測試方法慣用 test 開頭
public void testAdd() {
assertTrue("1+1=2", 1 + 1 == 2);
}
public void testDivideByZero() {
try { int x = 1/0; fail("應拋出異常"); }
catch (ArithmeticException e) { /* 通過 */ }
}
// 手動編寫 suite() 註冊測試
public Test suite() {
TestSuite ts = new TestSuite();
ts.addTest(new MathTest("testAdd", new TestMethod() {
public void run(TestCase tc) { ((MathTest)tc).testAdd(); }
}));
ts.addTest(new MathTest("testDivideByZero", new TestMethod() {
public void run(TestCase tc) { ((MathTest)tc).testDivideByZero(); }
}));
return ts;
}
}
關鍵點:
• 匿名類實現 TestMethod.run() 轉發到具體測試方法
• 一個 TestMethod 僅調用一個測試方法,確保失敗隔離
• 構造函數雙參數為框架契約
2. 測試套件聚合
public class AllTests extends TestCase {
public Test suite() {
TestSuite ts = new TestSuite();
ts.addTest(new MathTest().suite());
ts.addTest(new StringTest().suite());
return ts;
}
}
兩種運行模式
模式一:TextUI(桌面模擬器/命令列)
public static void main(String[] args) {
String[] runnerArgs = new String[] { "com.myapp.test.AllTests" };
j2meunit.textui.TestRunner.main(runnerArgs);
}
控制台輸出類似 JUnit 文本報表(綠條/紅條、錯誤堆疊)。
模式二:MidletUI(真機/模擬器)— 核心優勢
import j2meunit.midletui.TestRunner;
public class TestMIDlet extends TestRunner {
protected void startApp() {
start(new String[] { "com.myapp.test.AllTests" });
}
}
或在 JAD 中配置:J2ME-Unit-TestClasses: com.myapp.test.MathTest,com.myapp.test.StringTest
真機測試價值:在實際硬體驗證記憶體、網路、RMS、PIM 等平台相關行為,模擬器無法完全複現。
實戰成果
作者在 MIDP 1.0 真機 (Moto T720) 運行測試套件,耗時 401ms,結果與模擬器一致。證明 J2ME Unit 可在生產環境提供可信的回歸保障。
最佳實踐建議
- 持續整合:構建腳本整合 WTK 模擬器批量運行 TextUI 測試
- 分層測試:純邏輯單元測試用 TextUI;平台相關(RMS/網路/PIM)必須真機 MidletUI
- 測試命名:
test[Method]_[Scenario]_[Expected] 如 testRMS_write_full_throwsException
- 斷言豐富度:善用
assertEquals/assertNotNull/assertSame/fail 提供清晰失敗訊息
- 避免副作用:
setUp/tearDown 確保測試隔離,RMS 測試前後清理記錄存儲
結語
J2ME Unit 以「手動 suite 註冊 + 單方法綁定 + 雙重運行模式」三大創新,在無反射的受限環境中帶來了工業級單元測試能力。將其納入 J2ME 專案標準流程,能像桌面/服務端開發一樣,以測試驅動開發(TDD)守護代碼質量,大幅降低嵌入式軟體的維護風險與發布焦慮。
- 上一篇文章: J2ME 阻塞式對話框實現原理:突破事件回調限制的同步交互模式
- 下一篇文章: 深入解析 J2ME Web 服務 API (JSR 172) 架構與應用
Copyright ©
程式碼之家 All Rights Reserved