J2ME 缺乏 Reflection API,傳統 JUnit 無法自動發現測試。j2meunit (17KB, 開源) 移植 JUnit 核心機制至 J2ME,支援文本與 MIDlet 兩種測試介面,讓單元測試進入真機成為可能。
j2meunit.jar。Properties → Java Build Path → Libraries → Add External JARs 加入 jar。public class TestOne extends j2meunit.framework.TestCase {
// 必須提供此建構子供框架回呼
public TestOne(String name, j2meunit.framework.TestMethod method) {
super(name, method);
}
public void testOne() {
System.out.println("TestOne.testOne()");
assertTrue("Should be true", false); // 故意失敗示範
}
public void testTwo() {
System.out.println("TestOne.testTwo()");
throw new RuntimeException("Exception"); // 例外測試
}
// 手動組裝 TestSuite (無 Reflection 需手寫)
public j2meunit.framework.Test suite() {
j2meunit.framework.TestSuite ts = new j2meunit.framework.TestSuite();
ts.addTest(new TestOne("testOne", new j2meunit.framework.TestMethod() {
public void run(j2meunit.framework.TestCase tc) { ((TestOne)tc).testOne(); }
}));
ts.addTest(new TestOne("testTwo", new j2meunit.framework.TestMethod() {
public void run(j2meunit.framework.TestCase tc) { ((TestOne)tc).testTwo(); }
}));
return ts;
}
}
關鍵機制:每個 TestCase 實例僅綁定一個 TestMethod (單一測試方法),透過匿名類別與建構子實現綁定。切勿在一個 TestMethod 執行多個測試,否則前者失敗會阻斷後續。
public class TestAll extends j2meunit.framework.TestCase {
public j2meunit.framework.Test suite() {
j2meunit.framework.TestSuite ts = new j2meunit.framework.TestSuite();
ts.addTest(new TestOne().suite());
ts.addTest(new TestTwo().suite()); // 假設存在 TestTwo
return ts;
}
}
public static void main(String[] args) {
String[] runnerArgs = new String[] { "com.example.TestAll" };
j2meunit.textui.TestRunner.main(runnerArgs);
}
public class TestRunnerMidlet extends j2meunit.midletui.TestRunner {
protected void startApp() {
start(new String[] { "com.example.TestAll" });
}
}
或在 JAD 加入 J2MEUnitTestClasses: com.example.TestAll, com.example.TestOther 無需修改主類。
test 開頭,未來若支援 Reflection 可無縫遷移。setUp()/tearDown() 管理測試夾具。