對Struts2進行單元測試,以struts 2.2.1.1爲例 ,可以使用struts2發行包中的struts2-junit-plugin-2.2.1.1.jar,它裏面提供了兩個類StrutsTestCase、StrutsSpringTestCase,分別提供對純struts應用和struts+spring整合時的單元測試支持。下面分別說明。
1.StrutsTestCase
首先準備一個純struts2工程,建立工程過程略,但有如下的類:
Account.java,是bean
AccountAction.java
測試類:
TestAccountAction.java
測試邏輯比較簡單,action中的validate方法會保證用戶名長度在5--9之間。
定義struts.xml,放在類路徑的根目錄下,而非web-inf/classes下,否則會找不到,不會加載你定義的內容。
至於action/result的定義中用到的jsp頁面,不必真實存在,保持不爲空就行,否則,action測試的時候,會說result未定義之類的錯誤,因爲此測試會模擬action真實狀態下的運行。運行,一切OK。
正因爲會模擬真實狀態下的運行,所以攔截器也會正常被觸發,下面再定義一個攔截器測試一下:
MyInterceptor.java
修改一下struts.xml,加入攔截器的定義:
<package name="testit" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="testInterceptor" class="interceptor.MyInterceptor"/>
</interceptors>
<action name="createaccount" class="action.AccountAction">
<result name="success">/index.jsp</result>
<result name="input">/createaccount.jsp</result>
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="testInterceptor"/>
</action>
</package>
運行,控制檯會輸出:
before processing
bye bye execute
使用的jar包如下圖:
都是struts發行包提供的,其它不相關的jar不要加,尤其是以plugin.jar結尾的文件,更不要加struts2-spring-plugin-2.2.1.1.jar,加了會加載相關的東西,但這裏卻提供不了,導致測試無法運行。實際spring-beans-2.5.6.jar和spring-context-2.5.6.jar也不是必須的,但加了也無所謂,在StrutsSpringTestCase是需要的。另外,web.xml不需要配置,根本不會去這裏找配置信息。
2.StrutsSpringTestCase
這個和前面的過程類似,需要的類分別如下。
MathAction.java
MathService.java
測試類TestMathAction,測試一下MathService.add是否能正確地返回兩個數相加的值。
這裏有一個小trick,默認情況下,applicationContext.xml也要放在classpath的根目錄下,但如果項目需要不放在那裏,就要覆蓋getContextLocations方法返回其class path,開頭可以有也可以沒有“/”,這裏我放在包spring下,所以就返回spring/applicationContext.xml,至於struts和spring整合的配置就不用寫了,想必大家都會。需要的jar在上面的基礎上,加入struts2-spring-plugin-2.2.1.1.jar就行了,對了,兩種測試都需要jsp-api.jar和servlet-api.jar,去tomcat裏copy一份即可,junit.jar也是需要的(廢話?!)
參考:https://cwiki.apache.org/WW/struts-2-junit-plugin-tutorial.html