采用Struts中的Mock方式模擬action和actionForm進行測試
基礎類:STCRequestProcessor
作用:Ioc 將模擬的Action,ActionForm注入到struts-config.xml中的相應的action位置
???1.?package?test.sample.service.util;??
???
2.?import?java.io.IOException;??
???
3.?import?java.util.HashMap;??
???
4.?import?javax.servlet.http.HttpServletRequest;??
???
5.?import?javax.servlet.http.HttpServletResponse;??
???
6.?import?javax.servlet.http.HttpSession;??
???
7.???
???
8.?import?org.apache.struts.action.Action;??
???
9.?import?org.apache.struts.action.ActionForm;??
??
10.?import?org.apache.struts.action.ActionMapping;??
??
11.?import?org.apache.struts.action.RequestProcessor;??
??
12.?import?org.apache.struts.util.RequestUtils;??
??
13.???
??
14.?/**?*//**?
??15.??*?
@author?administrator?
??16.??*?
??17.??*?To?change?this?generated?comment?edit?the?template?variable?"typecomment":?
??18.??*?Window>Preferences>Java>Templates.?
??19.??*?To?enable?and?disable?the?creation?of?type?comments?go?to?
??20.??*?Window>Preferences>Java>Code?Generation.?
??21.??
*/??
??
22.?public?class?STCRequestProcessor?extends?RequestProcessor?{??
??
23.???
??
24.?????private?static?HashMap?mockActionFormMap?=?new?HashMap();??
??
25.?????private?static?HashMap?mockActionMap?=?new?HashMap();??
??
26.???
??
27.?????public?static?void?addMockAction(String?actionStr,?String?className)???
??
28.?????{??
??
29.?????????mockActionMap.put(actionStr,?className);??
??
30.?????}??
??
31.?????public?static?void?addMockActionForm(String?actionFormStr,String?className)??
??
32.?????{??????
??
33.?????????mockActionFormMap.put(actionFormStr,?className);??
??
34.?????}??
??
35.?????/**?*//**?
??36.??????*?We?will?insert?Mock?ActionForm?for?testing?through?this?method?
??37.??????
*/??
??
38.?????protected?ActionForm?processActionForm(??
??
39.?????????HttpServletRequest?request,??
??
40.?????????HttpServletResponse?response,??
??
41.?????????ActionMapping?mapping)?{??
??
42.???
??
43.???????????
??
44.?????????//?Create?(if?necessary?a?form?bean?to?use??
??45.?????????String?formBeanName?=?mapping.getName();??
??
46.?????????String?mockBeanClassName?=?(String)?mockActionFormMap.get(formBeanName);??
??
47.?????????if?(mockBeanClassName?==?null)??
??
48.?????????????return?super.processActionForm(request,?response,?mapping);??
??
49.???
??
50.?????????ActionForm?instance?=?null;??
??
51.?????????try?{??
??
52.?????????????Class?formClass?=?Class.forName(mockBeanClassName?);??
??
53.?????????????instance?=?(ActionForm)?formClass.newInstance();??
??
54.?????????}?catch?(ClassNotFoundException?e)?{??
??
55.?????????????e.printStackTrace();??
??
56.?????????}?catch?(InstantiationException?e)?{??
??
57.?????????????e.printStackTrace();??
??
58.?????????}?catch?(IllegalAccessException?e)?{??
??
59.?????????????e.printStackTrace();??
??
60.?????????}??
??
61.???
??
62.?????????instance.setServlet(servlet);??
??
63.?????????if?(instance?==?null)?{??
??
64.?????????????return?(null);??
??
65.?????????}??
??
66.???
??
67.?????????if?(log.isDebugEnabled())?{??
??
68.?????????????log.debug(??
??
69.?????????????????"?Storing?ActionForm?bean?instance?in?scope?'"??
??
70.?????????????????????+?mapping.getScope()??
??
71.?????????????????????+?"'?under?attribute?key?'"??
??
72.?????????????????????+?mapping.getAttribute()??
??
73.?????????????????????+?"'");??
??
74.?????????}??
??
75.?????????if?("request".equals(mapping.getScope()))?{??
??
76.?????????????request.setAttribute(mapping.getAttribute(),?instance);??
??
77.?????????}?else?{??
??
78.?????????????HttpSession?session?=?request.getSession();??
??
79.?????????????session.setAttribute(mapping.getAttribute(),?instance);??
??
80.?????????}??
??
81.?????????return?(instance);??
??
82.???
??
83.?????}??
??
84.???
??
85.?????/**?*//**?
??86.??????*?We?will?insert?Mock?Action?Class?through?this?method?
??87.??????
*/??
??
88.?????protected?Action?processActionCreate(??
??
89.?????????HttpServletRequest?request,??
??
90.?????????HttpServletResponse?response,??
??
91.?????????ActionMapping?mapping)??
??
92.?????????throws?IOException?{??
??
93.?????????String?orignalClassName?=?mapping.getType();??
??
94.?????????String?mockClassName?=?(String)mockActionMap.get(orignalClassName);??
??
95.?????????if(?mockClassName?==?null?)??
??
96.?????????????return?super.processActionCreate(request,response,mapping);??
??
97.?????????String?className?=?mockClassName;??????????
??
98.?????????if?(log.isDebugEnabled())?{??
??
99.?????????????log.debug("?Looking?for?Action?instance?for?class?"?+?className);??
?
100.?????????}??
?
101.???
?
102.?????????Action?instance?=?null;??
?
103.?????????synchronized?(actions)?{??
?
104.???
?
105.?????????????//?Return?any?existing?Action?instance?of?this?class??
?106.?????????????instance?=?(Action)?actions.get(className);??
?
107.?????????????if?(instance?!=?null)?{??
?
108.?????????????????if?(log.isTraceEnabled())?{??
?
109.?????????????????????log.trace("??Returning?existing?Action?instance");??
?
110.?????????????????}??
?
111.?????????????????return?(instance);??
?
112.?????????????}??
?
113.???
?
114.?????????????//?Create?and?return?a?new?Action?instance??
?115.?????????????if?(log.isTraceEnabled())?{??
?
116.?????????????????log.trace("??Creating?new?Action?instance");??
?
117.?????????????}??
?
118.???
?
119.?????????????try?{??
?
120.?????????????????instance?=?(Action)?RequestUtils.applicationInstance(className);??
?
121.?????????????}?catch?(Exception?e)?{??
?
122.?????????????????log.error(??
?
123.?????????????????????getInternal().getMessage("actionCreate",?mapping.getPath()),??
?
124.?????????????????????e);??
?
125.???
?
126.?????????????????response.sendError(??
?
127.?????????????????????HttpServletResponse.SC_INTERNAL_SERVER_ERROR,??
?
128.?????????????????????getInternal().getMessage(??
?
129.?????????????????????????"actionCreate",??
?
130.?????????????????????????mapping.getPath()));??
?
131.???
?
132.?????????????????return?(null);??
?
133.?????????????}??
?
134.???
?
135.?????????????instance.setServlet(this.servlet);??
?
136.?????????????actions.put(className,?instance);??
?
137.?????????}??
?
138.???
?
139.?????????return?(instance);??
?
140.?????}??
?
141.???
?
142.?}??
Test類:
setUp()方法:
super.setUp();//調用mockStrutsTestCase中的setUp方法
File web = new File("E:/project/portal/WebContent");
this.setContextDirectory(web);//定位工程包的位置
setConfigFile("/WEB-INF/web.xml");//定位工程中的web.xml位置
setConfigFile("/WEB-INF/struts-config.xml");//定位工程中struts-config.xml位置
STCRequestProcessor.addMockActionForm("ser_wordForm", "test.sample.service.form.MockWordForm");//注入模擬的form
STCRequestProcessor.addMockAction("com.huawei.service.action.WordAction","test.sample.service.action.MockWordAction");// 注入模擬的action
setRequestPathInfo("/service/word");//定義struts-config.xml中的path名稱
???1.?package?test.sample.service.action;??
???
2.???
???
3.???
???
4.?import?java.io.File;??
???
5.???
???
6.?import?servletunit.struts.MockStrutsTestCase;??
???
7.?import?test.sample.service.util.STCRequestProcessor;??
???
8.?/**?*//**?
???9.??*??
??10.?-??setContextDirectory,設置web應用的根??
??11.?-??setRequestPathInfo,設置request的請求??
??12.?-??addRequestParameter,將參數和對應的值加入request中??
??13.?-??actionPerform,執行這個請求??
??14.?-??verifyForward,驗證forward的名字是否正確??
??15.?-??verifyForwardPath,驗證forward的path是否正確??
??16.?-??verifyNoActionErrors,驗證在action執行過程中沒有ActionError產生??
??17.?-??verifyActionErrors,驗證在action執行過程中產生的ActionError集合的內容??
??18.??*?
@author?donganlei?
??19.??*?
??20.??
*/??
??
21.?public?class?MockWordActionTest?extends?MockStrutsTestCase?{??
??
22.???????
??
23.?????public?void?testInvalidPageflag1()throws?Exception{??
??
24.???????????addRequestParameter("reqCode","getWordList");??
??
25.???????????addRequestParameter("pageflag","userquery");??
??
26.???????????actionPerform();??
??
27.???????????verifyNoActionErrors();??
??
28.???????????verifyForward("querylist");??
??
29.?????}??
??
30.???????
??
31.?????public?void?testInvalidPageflag2()throws?Exception{??
??
32.???????????addRequestParameter("reqCode","getWordList");??
??
33.???????????addRequestParameter("pageflag","seatquery");??
??
34.???????????actionPerform();??
??
35.???????????verifyNoActionErrors();??
??
36.???????????verifyForward("querylist");??
??
37.?????}??
??
38.???????
??
39.?????public?void?testInvalidInitUpdate()throws?Exception{??
??
40.???????????addRequestParameter("reqCode","initUpdate");??
??
41.???????????actionPerform();??
??
42.???????????verifyNoActionErrors();??
??
43.???????????verifyForward("update");??
??
44.?????}??
??
45.?????public?void?testinitUpdate()throws?Exception{??
??
46.???????????addRequestParameter("reqCode","initUpdate");??
??
47.???????????addRequestParameter("wordid","3");??
??
48.???????????addRequestParameter("roomid","3");??
??
49.???????????actionPerform();??
??
50.???????????verifyNoActionErrors();??
??
51.???????????verifyForward("update");??
??
52.?????}??
??
53.?????protected?void?setUp()?throws?Exception?{??
??
54.?????????super.setUp();??
??
55.?????????File?web?=?new?File("E:/project/portal/WebContent");??
??
56.?????????this.setContextDirectory(web);??
??
57.?????????setConfigFile("/WEB-INF/web.xml");??
??
58.?????????setConfigFile("/WEB-INF/struts-config.xml");??
??
59.?????????STCRequestProcessor.addMockActionForm("ser_wordForm",?"test.sample.service.form.MockWordForm");??
??
60.?????????STCRequestProcessor.addMockAction("com.huawei.service.action.WordAction","test.sample.service.action.MockWordAction");??
??
61.?????????setRequestPathInfo("/service/word");??
??
62.?????}??
??
63.?????public?static?void?main(String?args[]){??
??
64.?????????junit.textui.TestRunner.run(MockWordActionTest.class);??
??
65.?????}????
??
66.?}??
Struts-congfig.xml中的processorClass
<controller>
<set-property property="processorClass" value="test.sample.service.util.STCRequestProcessor"/>
</controller>