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

VisualAge for Java 中使用 JUnit 對 EJB 進行單元測試實戰

     編輯:Java 相關知識

背景與目標

針對 VisualAge for Java 3.5.3 + JUnit 3.7 環境,闡述如何為已部署的 EJB 編寫單元測試案例,驗證業務邏輯正確性。

測試案例開發步驟

1. 建立測試類別

public class SampleEjbBeanTest extends junit.framework.TestCase {
    private SampleEjb remoteInterface; // EJB Remote Interface

    // 靜態實例供 TestRunner 使用
    private static SampleEjbBeanTest instance;
    static {
        instance = new SampleEjbBeanTest("");
    }

2. Main 方法支援多種運行模式


    public static void main(String[] args) {
        if (args.length > 0) {
            if (args[0].equals("SWING")) {
                junit.swingui.TestRunner.run(instance.getClass());
            } else {
                junit.textui.TestRunner.run(instance.getClass());
            }
        } else {
            System.out.println("************************************");
            String className = instance.getClass().getName();
            className = className.substring(className.lastIndexOf(".") + 1);
            System.out.println("Test Report of: " + className);
            System.out.println("************************************");
            junit.textui.TestRunner.run(instance.getClass());
        }
    }

3. 連接 EJB 容器取得 Remote Interface


    public void getConnection() {
        getinfo("Running " + this.toString());
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.ibm.ejs.ns.jndi.CNInitialContextFactory");
        env.put(Context.PROVIDER_URL, "iiop://localhost:900");

        try {
            getinfo("Creating an initial context");
            InitialContext ic = new InitialContext(env);
            getinfo("Looking for the EJB SampleEjb");
            SampleEjbHome homeInterface = (SampleEjbHome) ic.lookup("SampleEjb");
            getinfo("Creating a new EJB instance");
            remoteInterface = homeInterface.create();
        } catch (NamingException e) {
            getinfo(e.toString());
            fail();
        } catch (Exception e) {
            getinfo("Create Exception: " + e);
            fail();
        }
    }

4. setUp 初始化測試夾具


    public void setUp() throws Exception {
        getConnection(); // 每個測試方法前建立 EJB 連線
    }

5. 編寫具體測試方法


    public void testAddition() {
        try {
            int result = remoteInterface.addition(10, 15);
            getinfo("----------------------------------");
            getinfo("Success without Exception");
            assertEquals(25, result);
        } catch (Exception e) {
            fail("Fail: " + e);
            System.out.println("Error: " + e);
        }
    }

6. 輔助輸出方法


    public void getinfo(boolean msg) { System.out.println(msg); }
    public void getinfo(String msg) { System.out.println(msg); }
}

執行前置作業

  1. 部署 EJB 至 WebSphere Test Environment。
  2. 啟動 Persistence Name Server 與 WebSphere Test Environment。
  3. 將 EJB 加入伺服器配置並啟動 EJB Server。
  4. 在 VisualAge 中執行測試類別 main 方法。

執行結果範例

************************************
Test Report of: SampleEjbBeanTest
************************************
. Running testAddition(com.prudential.retserv.chart.servlet.SampleEjbBeanTest)
Creating an initial context
Looking for the EJB SampleEjb
Creating a new EJB instance
----------------------------------
Success without exception
Time: 15.984s
OK (1 tests)

EJB 單元測試的特殊挑戰

  • 容器依賴:EJB 需容器提供上下文(事務、安全、資源管理),脫離容器測試易產生假陰性/假陽性。
  • 測試策略:測試案例**必須在部署 EJB 的容器中遠程調用** EJB,而非本地模擬。雖增加網路延遲,但保證真實運行環境一致性。
  • Mock 物件限制:雖可用 Mock 模擬容器服務,但複雜度高且難以完整複製容器行為,不如實際容器測試可靠。

JUnit 核心特性回顧

優點限制
加速開發、提升代碼品質不分離測試數據與代碼
自我驗證、即時回饋無法單元測試 Swing GUI、JSP、HTML
測試套件層次化組織不能替代功能/整合測試
廉價、易寫、Java 原生無法直接測試伺服器端 Java 代碼(需 Cactus 等擴展框架)
基於 Command + Composite 模式
免費開源

結語

單元測試是降低開發風險、提升代碼質量的關鍵實踐。在 EJB 開發前先寫測試套件(TDD),配合 JUnit 框架,能構建強有力的驗證與回歸保護網。即使環境限制(如 VisualAge + WebSphere),透過遠程調用真實容器中的 EJB,依然能實現有效的單元測試。

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