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。strutstest-2.1.*.jar、junit3.8.1.jar、WEB-INF 目錄。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()。
為避免測試階段查詢真實資料庫,建立測試專用子類覆寫查詢邏輯:
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、無錯誤訊息)。
cactus-1.6.1.jar、aspectjrt-1.1.1.jar。web.xml 宣告 ServletTestRedirector、ServletTestRunner 兩個 Servlet。cactus.properties 配置 cactus.contextURL=https://localhost:9080/sample1。CactusStrutsTestCase,部署應用至容器。jdbc/ds1。Cactus 為每個測試方法發起 HTTP 請求至 ServletTestRedirector,容器內執行測試邏輯,結果經 HTTP 響應返回客戶端驗證。STC 內部包裝 Request/Response 傳給 ActionServlet.doPost(),完整執行 Struts 流程含 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 運行時錯誤。
CactusStrutsTestCase 切換至整合測試。