JUnit 依賴反射 API,但 Java ME (CLDC) 不支持反射,導致標準 JUnit 無法移植。社區衍生出 J2MEUnit 與 JMUnit 兩大框架,現計劃合併為 J2MEUnit 2.0。本文聚焦 JMUnit 1.0.2 實戰。
JMUnit4CLDC10.jar (CLDC 1.0) 或 JMUnit4CLDC11.jar (CLDC 1.1 支持 float) 加入 classpath。jmunit.framework.cldc1x.TestCase。
public class DistanceConversion {
public static int feetToMeters(int ft) { return (ft * 3048)/10000; }
public static int metersToFeet(int m) { return (m * 3281)/1000; }
// milesToKM, kmToMiles...
}
public class TemperatureConversion {
public static float fahrenheitToCelsius(float f) { return ((f-32)/9)*5; }
public static float celsiusToFahrenheit(float c) { return ((c*9)/5)+32; }
public static boolean isHotter(float f, float c) { return fahrenheitToCelsius(f) > c; }
public static boolean isCooler(float f, float c) { return fahrenheitToCelsius(f) < c; }
}
CLDC 1.0 環境請用 int 替代 float。
import jmunit.framework.cldc11.*;
public class TemperatureConversionTest extends TestCase {
public TemperatureConversionTest() { super(4, "TemperatureConversionTest"); }
public void testFahrenheitToCelsius() throws AssertionFailedException {
float result = TemperatureConversion.fahrenheitToCelsius(66F);
assertEquals(18.88889F, result);
}
public void testCelsiusToFahrenheit() throws AssertionFailedException {
float result = TemperatureConversion.celsiusToFahrenheit(20F);
assertEquals(68F, result);
}
public void testIsHotter() throws AssertionFailedException {
assertTrue(TemperatureConversion.isHotter(70F, 2F));
}
public void testIsCooler() throws AssertionFailedException {
assertTrue(TemperatureConversion.isCooler(10F, 10F));
}
// 必須實現 test(int) 分發方法(無反射機制)
public void test(int testNumber) throws Throwable {
switch(testNumber) {
case 0: testFahrenheitToCelsius(); break;
case 1: testCelsiusToFahrenheit(); break;
case 2: testIsHotter(); break;
case 3: testIsCooler(); break;
}
}
// 可選:setup/tearDown 初始化清理資源(如 RecordStore)
// 可選:fail() 標記未完成測試
}
關鍵點:構造函數必須傳入測試方法數量與名稱;test(int) 手動分發;測試方法拋出 AssertionFailedException。
import jmunit.framework.cldc11.TestSuite;
public class ConversionTestSuite extends TestSuite {
public ConversionTestSuite() {
super("All Conversion Tests");
add(new DistanceConversionTest());
add(new TemperatureConversionTest());
}
}
測試類繼承 MIDlet,可在模擬器/真機運行。提供 Exit 與 Test 兩個命令。結果以圖形化綠/紅條顯示;失敗詳情輸出到控制台(含堆棧、期望/實際值),優於 J2MEUnit 僅設備端顯示。

得益於手動分發,可編寫帶參數測試方法:
public void testCelsiusToFahrenheit(float c, float f) throws AssertionFailedException {
assertEquals(f, TemperatureConversion.celsiusToFahrenheit(c));
}
// 在 test(int) 中調用
case 4: testCelsiusToFahrenheit(20F, 68F); break;
這是標準 JUnit(依賴反射)無法直接實現的靈活性。