16.3 测试完整的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,示例代码如下:
java代码:
- <package name="helloworld" extends="struts-default">
- <action name="testAction" class="cn.javass.test.TestAction">
- <result>/nosuch.jsp</result>
- <result name="error">/nosuch.jsp</result>
- <result name="input">/nosuch.jsp</result>
- </action>
- </package>
上面的配置和以前的配置是一样的,只是在配置<result>元素的时候,对应的jsp可以暂时还没有。
3:准备验证框架的配置
TestAction代码还保持和上一节中一样,来为这个TestAction准备验证配置文件。该文件的名称为TestAction-validation.xml,放置到TestAction的同包下。
这里只是简单的为user.age属性添加了一个int验证器,要求填入的年龄不小于18岁,示例代码如下:
java代码:
- <validators>
- <field name="user.age">
- <field-validator type="int">
- <param name="min">18</param>
- <message>年龄要大于等于18岁</message>
- </field-validator>
- </field>
- </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代码:
- public class TestActionFullTestCase extends StrutsTestCase {
- public void testFull(){
-
- ActionProxy actionProxy = this.getActionProxy("/testAction");
-
- Map<String,Object> map = new HashMap<String, Object>();
- map.put("user.name", "Struts2");
- map.put("user.age", 12);
-
- actionProxy.getInvocation().getInvocationContext().setParameters(map);
-
- try {
-
- String result = actionProxy.execute();
-
- TestAction action = (TestAction) actionProxy.getAction();
-
- assertEquals(0,action.getFieldErrors().size());
- assertEquals("success", result);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
16.3.4运行测试用例
现在在测试用例中,我们传入的数据是:name为struts2,年龄是12,运行的结果会是什么呢?
传入的年龄是12,决定了它不能通过验证,验证要求传入的年龄必须不小于18。因此,根本就不会调用execute方法,而是直接返回“input”;同时,应该存在一个字段错误,其信息是“年龄要大于等于18”。
运行结果如下图所示:
图16.5 使用StrutsTestCase的运行结果一
如果传入的年龄数据为22,再次运行测试一下,应该能够通过了,运行结果如下:
图16.6 使用StrutsTestCase的运行结果二
通过上面的示例可以看出,Struts2对于单元测试的支持是非常好的。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/4145.html】
欢迎访问http://sishuok.com获取更多内容
分享到:
相关推荐
研磨Struts2
研磨struts2博文,详细讲解了struts2运行流程,值得大家阅读
《研磨Struts2》原书配套源代码,配合Struts2原书使用,快速学习Struts2技术。
由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。
研磨Struts2 高清完整版,请和第一部分一起下载啊
《研磨Struts2》原书配套PPT,结合《研磨Struts2》配套使用,快速学习Struts2框架。
研磨struts2_系列文章.pdf
研磨Struts2_12859679_高清完整版
《研磨Struts 2》PDF版本下载
研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人
研磨struts,仅是简版,我也是从网上下来的。大家凑合看吧。
第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...
第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...
第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...
研磨设计模式(完整版pdf)相信我不用介绍,很多人都在找这本书吧,今天我特意从另外的地方下载到了这本书,发了几十积分。才弄到。为了让大家同时分享这本书的精华。我今天特意上传。注:此电子书较大,我分了3个...
第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 ...