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

StrutsTestCase 實戰指南:Mock 與 Cactus 雙模式簡化 Struts 單元測試

     編輯:Java 相關知識

StrutsTestCase (STC) 是專為 Struts Web 應用設計的開源測試框架,支援 ActionForm 驗證、Action 業務邏輯、轉向邏輯與 JSP 轉發的全方位測試。本文以登入系統為例,詳細演示 Mock 模式(單元測試)與 Cactus 模式(整合測試)的環境配置、核心 API 用法與最佳實踐。

示例應用:登入系統

  • Login.jsp:使用 Struts 標籤庫構建表單,欄位 userName、password。
  • LoginActionForm:validate() 檢查必填欄位、查詢 USERDISABLED 表判斷帳號停用。
  • LoginAction:execute() 驗證 USER 表帳密,成功存入 Session 轉向 Success.jsp,失敗返回登入頁。
  • struts-config.xml:映射 /login 路徑至 LoginAction,成功轉向 /Success.jsp。

Mock 模式:無容器的高速單元測試

環境設置

  1. Classpath 加入 strutstest-2.1.*.jar、junit3.8.1.jar、WEB-INF 目錄。
  2. 測試類繼承 MockStrutsTestCase。

核心測試流程


public void testLoginActionFormError() throws Exception {
    setRequestPathInfo("/login");           // 指定測試的 ActionMapping
    actionPerform();                        // 執行 Struts 處理流程
    verifyActionErrors(new String[]{"username.required","password.required"}); // 驗證錯誤訊息
    verifyInputForward();                   // 驗證返回輸入頁 (Login.jsp)
}

關鍵 API:setRequestPathInfo()、addRequestParameter()、actionPerform()、verifyActionErrors()、verifyInputForward()、verifyForward()、verifyNoActionErrors()。

Mock 物件隔離資料庫依賴

為避免測試階段查詢真實資料庫,建立測試專用子類覆寫查詢邏輯:

  • MockLoginActionForm 覆寫 isUserDisabled():僅 "disableduser" 返回 true。
  • MockLoginAction 覆寫 isValidUser():僅 "ibmuser"/"ibmpassword" 返回 true。

透過 STCRequestProcessor(繼承 RequestProcessor)動態植入 Mock 實作:


// struts-config.xml 註冊
<controller>
  <set-property property="processorClass" value="com.sample.util.STCRequestProcessor"/>
</controller>

// 測試代碼植入
STCRequestProcessor.addMockActionForm("loginForm", "com.sample.login.mock.MockLoginActionForm");
STCRequestProcessor.addMockAction("com.sample.login.LoginAction", "com.sample.login.mock.MockLoginAction");

測試案例覆蓋:空帳密、停用帳號、無效登入、有效登入(驗證轉向 success、無錯誤訊息)。

Mock 模式優缺點

  • 優點:極速(無容器啟動)、隔離外部依賴、適合 TDD 快速迭代。
  • 缺點:無法驗證 Listener/Filter 副作用、無法執行 JSP 編譯與運行時檢查。

Cactus 模式:容器內的整合測試

環境設置

  1. Classpath 加入 cactus-1.6.1.jar、aspectjrt-1.1.1.jar。
  2. web.xml 宣告 ServletTestRedirector、ServletTestRunner 兩個 Servlet。
  3. cactus.properties 配置 cactus.contextURL=https://localhost:9080/sample1。
  4. 測試類繼承 CactusStrutsTestCase,部署應用至容器。
  5. 配置資料源 jdbc/ds1。

運作原理

Cactus 為每個測試方法發起 HTTP 請求至 ServletTestRedirector,容器內執行測試邏輯,結果經 HTTP 響應返回客戶端驗證。STC 內部包裝 Request/Response 傳給 ActionServlet.doPost(),完整執行 Struts 流程含 JSP 轉發。

關鍵差異:測試 JSP 編譯/運行錯誤


public void testValidLogin() throws Exception {
    // ... 植入 Mock 實作 ...
    processRequest(true);  // 關鍵:啟用 JSP 驗證
    setRequestPathInfo("/login");
    addRequestParameter("userName","ibmuser");
    addRequestParameter("password","ibmpassword");
    actionPerform();
    verifyNoActionErrors();
    verifyForward("success");
}

在 Success.jsp 植入 throw new RuntimeException("test error"),測試將捕獲 JSP 運行時錯誤。

Cactus 模式優缺點

  • 優點:真實容器環境、驗證 JSP 編譯/運行錯誤、可測試資料存取代碼。
  • 缺點:需部署容器、修改需重啟、速度較慢。

最佳實踐建議

  1. 開發期以 Mock 模式高速迭代單元測試。
  2. 代碼穩定後,僅變更測試類父類為 CactusStrutsTestCase 切換至整合測試。
  3. 善用 STC 節省環境設置時間,建立安全的重構防護網。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved