Struts 1 中如何测试Action
2013-09-11 10:26
267 查看
得至关重要。
在基于Struts项目中,会有大量封装业务流程的Action类,对它们的测试是必要的。
但由于Struts1中Action与Servlet容器的耦合程度较深,对Action的测试比较困难(
Action的execute方法需要HttpServletRequest和HttpServletResponse对象才能调
用)显然不适合大规模,迭代式的测试。
对于在测试过程中,对于某些不易构建的对象(如HTTPServletRequest对象),
可以创建一个虚拟的对象以便进行测试,这样的对象称之为mock对象,mock这个词的
含义是“模仿,仿制品”。
StrutTest组件作为Junit框架的扩展可以为我们创建出用于测试Strut Action
的mock对象。
可以从其官方网站下载该组件http://strutstestcase.sourceforge.net。
下面的Demo用于演示使用strutstest组件对Struts Action进行基于Junit的单元
测试。
以下是一个很简单的Action及其配置文件,是我们的测试目标,这个Action实现
了一个简单的登登~~登录功能(这样的Demo太多了是吧,我尽量保证是最后一次登
录 )
public class LogonAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
LogonForm f = (LogonForm) form;
String username = f.getUsername();
String password = f.getPassword();
if ("whatisjava".equals(username) && "java".equals(password)) {
HttpSession session = request.getSession();
session.setAttribute("username", username);
return mapping.findForward("success");
} else {
ActionMessages messages = new ActionMessages();
messages.add("fail.logon", new ActionMessage
("msg.fail.logon"));
saveMessages(request, messages);
return mapping.findForward("failed");
}
}
}
<action path="/logon" type="action.LogonAction" name="logonForm">
<forward name="success" path="/jsp/success.jsp"/>
<forward name="failed" path="/jsp/logon_form.jsp"/>
</action>
我们要测试的目标是,登录成功或失败后是否返回合适的forward对象,而且登录
成功后session对象中是否存有用户名,而登录失败后request中是存有相应的
ActionMessage对象。
首先将下载到的StrutsTest发行包中的strutstest-2.1.4.jar文件复制到应用的
/WEB-INF/lib目录下,另外该组件的运行还需要apache的commons-collections-
2.1.jar组件。
编写单元测试类TestLogonAction如下,注意:该测试类要继承StrutsTest的
MockStrutsTestCase类。根据测试用例编写测试方法:testSuccess用于测试登录成
功的情况而testFailed用于测试登录失败的情形。MockStrutsTestCase几个重要的
API需要了解一下:
setContextDirectory(File)用于指定web应用的根目录,StrutsTest在工作的时候
需要读取Struts配置文件struts-config.xml,StrutsTest会在指定的根目录下的
WEB-INF目录下查找struts-config.xml文件。注意,如果使用MyEclipse,它创建
Web项目时会默认在工程目录下建立一个名为WebRoot的子目录作为应用的根目录,这
样就需要运行setContextDirectory(new File("WebRoot"))方法。
addRequestParameter(String, String)该方法用于向StrutsTest提供的mock对象中
添加请求参数对以模拟用户提交的请求信息,这里使用该方法添加username和
password的请求参数对用于模拟用户的登录表单提交。
setRequestPathInfo(String)该方法用于设定要访问的Action,String类型的参数
为要访问的Action在Struts配置文件中对应的path属性值。
getSession()用于获取StrutsTest创建的用于模拟HttpSesssion对象的mock对象。
getRequest()用于获取StrutsTest创建的用于模拟HttpServletRequest对象的mock
对象。
verifyForward(String)断言方法,表示Action返回的特定的Forward对象,其中字
符串参数表示应该返回的Forward对象在Struts配置文件中对于的forward元素的name
属性。例如verifyForward("success"); 如果返回的ActionForward对象对应的name
不是success,则断言失败。verifyForwardPath(String)类似于verifyForward方法
,只不过String参数表示的是Action返回的forward对象所对应的URI地址。
verifyActionMessages(String[])断言方法,表示request中有一系列特定property
名称的ActionMessage对象。
actionPerform()执行测试过程。
测试类代码如下:
public class TestLogonAction extends MockStrutsTestCase {
protected void setUp() throws Exception {
super.setUp();
setContextDirectory(new File("WebRoot"));
setRequestPathInfo("/logon");
}
public void testSuccess() throws Exception {
addRequestParameter("username", "whatisjava");
addRequestParameter("password", "java");
actionPerform();
verifyForward("success");
verifyForwardPath("/jsp/success.jsp");
assertEquals("whatisjava", getSession().getAttribute
("username"));
}
public void testFailed() {
addRequestParameter("username", "whatisjava");
addRequestParameter("password", "avaj");
actionPerform();
verifyForward("failed");
verifyForwardPath("/jsp/logon_form.jsp");
verifyActionMessages(new String[]{"msg.fail.logon"});
assertNull(getSession().getAttribute("username"));
}
}
相关文章推荐
- Struts 1.2 中如何测试Action
- Struts 1.2 如何测试Action
- Struts 1.2 中如何测试Action
- struts中的action和Action类以及struts2中如何在Action类中获得servlet api的域对象
- AJAX编程技巧:在Struts Action中如何向客户端发送xml文件?
- struts.xml配置同名action测试
- [struts2.x] 探索struts值栈如何赋值给action成员变量
- 如何使用Spring来管理Struts中的Action
- Jsp中如何接收Struts的Action中放入值栈中的内容
- struts中 如何找action对应的jsp
- struts2.0中如何实现struts1.2中dispatchaction的功能
- 自学SSH框架之---struts(三):源码分析struts1如何实现Action单例模式
- 如何在struts项目中让标签的page属性的值可以是action的路径
- 测试Action组件代码(StrutsTestCase)
- 如何写公共的strutsAction
- 如何成功调试《Struts in Action》的第一例
- 请教:我用的jbuilder,struts架构,在action中的session赋中文值以后,回到jsp中,从session中取出的值为乱码,如何解决?
- 如何在struts.xml中取得action中的参数
- ASP.NET MVC单元测试时如何对含有ModelState.IsValid的Action进行测试
- Struts 2 的Action中如何获取request、response、session、application等web元素(1)