首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java ME 單元測試實戰:JMUnit 框架完整指南

     編輯:Java 相關知識

背景與挑戰

JUnit 依賴反射 API,但 Java ME (CLDC) 不支持反射,導致標準 JUnit 無法移植。社區衍生出 J2MEUnit 與 JMUnit 兩大框架,現計劃合併為 J2MEUnit 2.0。本文聚焦 JMUnit 1.0.2 實戰。

環境準備

  • 下載 JMUnit,將 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(依賴反射)無法直接實現的靈活性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved