Struts2運行流程
16.3.1概述
在上面單元測試動作類Action中,基本上是把Struts2的Action類當作一個普通的Java類來進行測試,就沒有涉及到Struts2的其他部分,也沒有涉及到完整的Struts2的運行流程,比如:攔截器、驗證框架、Result等等。
回憶一下Struts2的運行流程圖,如果想運行對應的攔截器的話,就不能直接運行Action對象,而是要在ActionProxy對象上下手,這樣才能根據struts.xml中的內容,裝配上對應的攔截器,并模擬Strus2的真實運行過程。
這也說明,要想測試完整的Struts2的運行流程,就應該在測試中獲取到ActionProxy對象,然后通過它來獲取ActionInvocation對象,然后運行ActionInvocation對象就可以依次調用:攔截器、Action、Result等組件。
那么在測試中,如何來獲取Struts2的ActionProxy對象呢?
Struts2框架給我們設計好了一個測試的父類,在這個類中直接可以根據URL返回對應的ActionProxy對象,所以,只要知道請求的URL就可以開始測試了。
還是用一個具體的示例來做說明,前面學習過驗證框架,這里就來測試驗證框架的功能是否正確吧,可以通過驗證框架返回的提示信息來判斷驗證框架是否正常運行,當然,如果通過了驗證框架的驗證,就該執行Action并返回Result了。
好了,接下來就來具體看看如何實現這樣的測試。當然,首先需要準備測試環境。
16.3.2準備測試環境內
1:準備要引用的jar包
首先把到我們的工程的WEB-INF\lib包下的jar包,恢復到最開始,也就是struts2-blank-2.1.8.1.war包里面的WEB-INF\lib包下的jar包。
然后到下載的Struts2資源包lib文件夾,也就是\struts-2.1.8.1\lib包下,拷貝以下四個jar包到我們的工程的WEB-INF\lib包下:
- struts2-junit-plugin-2.1.8.1.jar
- spring-core-2.5.6.jar
- spring-test-2.5.6.jar
- commons-logging-1.0.4.jar
2:配置動作類Action
這次測試要通過URL來引用Action,因此,需要在struts.xml中配置相應的Action,示例代碼如下:
上面的配置和以前的配置是一樣的,只是在配置<result>元素的時候,對應的jsp可以暫時還沒有。
3:準備驗證框架的配置
TestAction代碼還保持和上一節中一樣,來為這個TestAction準備驗證配置文件。該文件的名稱為TestAction-validation.xml,放置到TestAction的同包下。
這里只是簡單的為user.age屬性添加了一個int驗證器,要求填入的年齡不小于18歲,示例代碼如下:
和前面學習驗證框架的配置方式完全一樣。
16.3.3重寫測試用例
測試用例的代碼和前面可就大不一樣了,大致有如下改變:
- 繼承的父類不同:原來直接繼承junit的TestCase,現在要繼承來自struts2-junit-plugin-2.1.8.1.jar包中的StrutsTestCase。
- 不用新建TestAction對象,而是直接用它在struts.xml中配置的相對URL,通過父類的getActionProxy方法獲得ActionProxy對象。
- 傳入參數的方式不同:原來直接在TestAction對象上賦值就行,現在要新建一個Map,設置Action需要的所有參數,然后把這個Map和ActionContext的parameters關聯上。
示例代碼如下:
16.3.4運行測試用例
現在在測試用例中,我們傳入的數據是:name為struts2,年齡是12,運行的結果會是什么呢?
傳入的年齡是12,決定了它不能通過驗證,驗證要求傳入的年齡必須不小于18。因此,根本就不會調用execute方法,而是直接返回“input”;同時,應該存在一個字段錯誤,其信息是“年齡要大于等于18”。
運行結果如下圖所示:
圖16.5 使用StrutsTestCase的運行結果一
如果傳入的年齡數據為22,再次運行測試一下,應該能夠通過了,運行結果如下:
圖16.6 使用StrutsTestCase的運行結果二
通過上面的示例可以看出,Struts2對于單元測試的支持是非常好的。
私塾在線網站原創