JUnit 依賴反射 API,而 Java ME (CLDC) 不支援反射,導致標準 JUnit 無法直接用於 Java ME 專案。為填補空白,社群開發了 J2MEUnit 與 JMUnit 兩大開源框架(現已規劃合併為 J2MEUnit 2.0)。本文聚焦 JMUnit。
jmunit.jar,建置路徑加入。// 單位轉換工具類 (CLDC 1.1 float 支援)
public class DistanceConversion {
public static int feetToMeters(int ft) { return (ft * 3048) / 10000; }
public static int metersToFeet(int m) { return (m * 3281) / 1000; }
public static int milesToKm(int mi) { return (mi * 1609) / 1000; }
public static int kmToMiles(int km) { return (km * 6214) / 10000; }
}
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 版本請將 float 改為 int 定點運算
import com.jmunit.TestCase;
import com.jmunit.TestSuite;
public class ConversionTest extends TestCase {
public ConversionTest(String name) { super(name); }
public void testFeetToMeters() {
assertEquals(3, DistanceConversion.feetToMeters(10)); // 10 ft ≈ 3 m
assertEquals(30, DistanceConversion.feetToMeters(100));
}
public void testMetersToFeet() {
assertEquals(3281, DistanceConversion.metersToFeet(1000)); // 1000 m ≈ 3281 ft
}
public void testTemperature() {
assertTrue(TemperatureConversion.isHotter(100f, 37f)); // 100°F > 37°C
assertFalse(TemperatureConversion.isCooler(100f, 37f));
}
// 靜態 suite() 方法供測試運行器發現
public static TestSuite suite() {
TestSuite suite = new TestSuite();
suite.addTest(new ConversionTest("testFeetToMeters"));
suite.addTest(new ConversionTest("testMetersToFeet"));
suite.addTest(new ConversionTest("testTemperature"));
return suite;
}
}
java -cp jmunit.jar:classes com.jmunit.textui.TestRunner ConversionTestjmunit 任務,自動化執行。雖 Java ME 發展趨緩,但嵌入式、功能機、舊系統維護仍需單元測試保障品質,JMUnit/J2MEUnit 是成熟可靠的選擇。