Struts2運行流程

suunny 11年前發布 | 25K 次閱讀 Struts2 Web框架

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,示例代碼如下:

 

java代碼:
  1. <package name="helloworld" extends="struts-default">  
  2.     <action name="testAction" class="cn.javass.test.TestAction">  
  3.             <result>/nosuch.jsp</result>  
  4.             <result name="error">/nosuch.jsp</result>  
  5.             <result name="input">/nosuch.jsp</result>  
  6.     </action>  
  7. </package>  

上面的配置和以前的配置是一樣的,只是在配置<result>元素的時候,對應的jsp可以暫時還沒有。

3:準備驗證框架的配置

TestAction代碼還保持和上一節中一樣,來為這個TestAction準備驗證配置文件。該文件的名稱為TestAction-validation.xml,放置到TestAction的同包下。

這里只是簡單的為user.age屬性添加了一個int驗證器,要求填入的年齡不小于18歲,示例代碼如下:

 

java代碼:
  1. <validators>  
  2.     <field name="user.age">  
  3.         <field-validator type="int">  
  4.             <param name="min">18</param>  
  5.             <message>年齡要大于等于18歲</message>  
  6.         </field-validator>  
  7.     </field>  
  8. </validators>  

和前面學習驗證框架的配置方式完全一樣。

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關聯上。

示例代碼如下:

 

java代碼:
  1. public class TestActionFullTestCase extends StrutsTestCase {  
  2.     public void testFull(){       
  3.         //建立ActionProxy對象  
  4.         ActionProxy actionProxy = this.getActionProxy("/testAction");  
  5.         //設置需要的參數  
  6.         Map<String,Object> map = new HashMap<String, Object>();  
  7.         map.put("user.name""Struts2");  
  8.         map.put("user.age"12);  
  9.         //將參數Map關聯到ActionContext上  
  10.         actionProxy.getInvocation().getInvocationContext().setParameters(map);  
  11.           
  12.         try {  
  13.             //調用  
  14.             String result = actionProxy.execute();  
  15.             //輸出是否有字段驗證錯誤  
  16.             TestAction action = (TestAction) actionProxy.getAction();  
  17.             //單元測試結果  
  18.             assertEquals(0,action.getFieldErrors().size());  
  19.             assertEquals("success", result);  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }         
  23.     }  
  24. }  

16.3.4運行測試用例

現在在測試用例中,我們傳入的數據是:name為struts2,年齡是12,運行的結果會是什么呢?

       傳入的年齡是12,決定了它不能通過驗證,驗證要求傳入的年齡必須不小于18。因此,根本就不會調用execute方法,而是直接返回“input”;同時,應該存在一個字段錯誤,其信息是“年齡要大于等于18”。

       運行結果如下圖所示:

 

圖16.5 使用StrutsTestCase的運行結果一

如果傳入的年齡數據為22,再次運行測試一下,應該能夠通過了,運行結果如下:

圖16.6 使用StrutsTestCase的運行結果二

通過上面的示例可以看出,Struts2對于單元測試的支持是非常好的。

 

私塾在線網站原創

 本文由用戶 suunny 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!