`
casec12
  • 浏览: 46679 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts 1.2 如何测试Action(转)

阅读更多

在测试驱动开发(Test-Driven Development TDD)的理念下,单元测试技术显得至关重要。

在基于Struts项目中,会有大量封装业务流程的Action类,对它们的测试是必要的。但由于Struts1中Action与Servlet容器的耦合程度较深,对Action的测试比较困难(Action的execute方法需要HttpServletRequest和HttpServletResponse对象才能调用)显然不适合大规模,迭代式的测试。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 对于在测试过程中,对于某些不易构建的对象(如HTTPServletRequest对象),可以创建一个虚拟的对象以便进行测试,这样的对象称之为mock对象,mock这个词的含义是“模仿,仿制品”。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> StrutTest组件作为Junit框架的扩展可以为我们创建出用于测试Strut Action的mock对象。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 可以从其官方网站下载该组件http://strutstestcase.sourceforge.net

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 下面的Demo用于演示使用strutstest组件对Struts Action进行基于Junit的单元测试。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 以下是一个很简单的Action及其配置文件,是我们的测试目标,这个Action实现了一个简单的登登~~登录功能(这样的Demo太多了是吧,我尽量保证是最后一次登录

 <wbr></wbr>

 <wbr></wbr>public class LogonAction extends Action {

 <wbr></wbr> <wbr></wbr> public ActionForward execute(ActionMapping mapping, ActionForm form,
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> HttpServletRequest request, HttpServletResponse response)
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> throws Exception {
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> LogonForm f = (LogonForm) form;
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> String username = f.getUsername();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> String password = f.getPassword();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> if ("whatisjava".equals(username) && "java".equals(password)) {
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> HttpSession session = request.getSession();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> session.setAttribute("username", username);
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> return mapping.findForward("success");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> } else {
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> ActionMessages messages = new ActionMessages();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>messages.add("fail.logon", new ActionMessage("msg.fail.logon"));
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> saveMessages(request, messages);
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> return mapping.findForward("failed");
 <wbr></wbr> <wbr></wbr> <wbr></wbr>  <wbr></wbr> <wbr></wbr> }
 <wbr></wbr> <wbr></wbr> <wbr></wbr>}

}

 <wbr></wbr>

<action path="/logon" type="action.LogonAction" name="logonForm">
 <wbr></wbr> <wbr></wbr> <wbr></wbr><forward name="success" path="/jsp/success.jsp"/>
 <wbr></wbr> <wbr></wbr> <wbr></wbr><forward name="failed" path="/jsp/logon_form.jsp"/>
 <wbr></wbr></action>

 <wbr></wbr>

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 我们要测试的目标是,登录成功或失败后是否返回合适的forward对象,而且登录成功后session对象中是否存有用户名,而登录失败后request中是存有相应的ActionMessage对象。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 首先将下载到的StrutsTest发行包中的strutstest-2.1.4.jar文件复制到应用的/WEB-INF/lib目录下,另外该组件的运行还需要apache的commons-collections-2.1.jar组件。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 编写单元测试类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()执行测试过程。

 <wbr></wbr> <wbr></wbr> <wbr></wbr> 测试类代码如下: <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>

public class TestLogonAction extends MockStrutsTestCase {
 <wbr></wbr> <wbr></wbr> protected void setUp() throws Exception {
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> super.setUp();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> setContextDirectory(new File("WebRoot"));
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> setRequestPathInfo("/logon");
 <wbr></wbr>  <wbr></wbr>}

 <wbr></wbr> <wbr></wbr> public void testSuccess() throws Exception {
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> addRequestParameter("username", "whatisjava");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> addRequestParameter("password", "java");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> actionPerform();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> verifyForward("success");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>  <wbr></wbr>verifyForwardPath("/jsp/success.jsp");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>  <wbr></wbr>assertEquals("whatisjava", getSession().getAttribute("username"));
 <wbr></wbr> <wbr></wbr> }

 <wbr></wbr> <wbr></wbr> public void testFailed() {
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> addRequestParameter("username", "whatisjava");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> addRequestParameter("password", "avaj");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> actionPerform();
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> verifyForward("failed");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> verifyForwardPath("/jsp/logon_form.jsp");
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> verifyActionMessages(new String[]{"msg.fail.logon"});
 <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> assertNull(getSession().getAttribute("username"));

 <wbr></wbr> <wbr></wbr> }

}

分享到:
评论

相关推荐

    struts1.2驱动包

    Struts1.2驱动包是Java Web开发中一个重要的组件,它是Apache Struts框架的特定版本,用于支持基于Model-View-Controller (MVC)设计模式的应用程序开发。Struts1.2因其稳定性和广泛的功能集而在过去备受推崇,尤其在...

    struts1.2资源整合

    在配置Struts1.2时,你需要在web.xml中设置Struts的前端控制器Filter(通常为`org.apache.struts.action.ActionServlet`),并配置相应的Action Mapping。同时,还需要在struts-config.xml文件中定义Action、Form ...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    在Struts1.2和Hibernate3.2集成中,Spring可以作为它们之间的粘合剂,比如管理Action的生命周期,提供数据访问的事务控制。 再来看Hibernate3.2,它是Java世界中广泛使用的ORM解决方案。通过将Java对象映射到数据库...

    struts1.2下载包

    在JSP中,Struts1.2扮演着核心控制器的角色,它将用户请求转发到相应的Action,然后Action处理业务逻辑,最终通过模型更新数据并传递结果到视图进行展示。 首先,我们来看"struts-1.2.9-bin"这个压缩包文件。这通常...

    STRUTS1.2中文文档

    2. **Action类**:Action类是Struts1.2的核心组件,它实现了Controller的功能。每个Action类对应一个用户请求,处理完成后返回一个ActionForward对象,指示下一个视图或动作。 3. **配置文件**:Struts1.2的配置...

    Struts1.2中文学习手册

    首先,手册会介绍Struts1.2的核心概念,包括Action类、Form Bean和Tiles布局。Action类是处理用户请求的核心,它接收来自控制器的请求并执行相应的业务逻辑。Form Bean则用于在控制器和视图之间传递数据,通常包含...

    struts、struts1.2 学习教程

    1. **ActionServlet**:Struts1.2使用单一的ActionServlet处理所有请求,而Struts2引入了Front Controller模式,所有的请求都由StrutsPrepareAndExecuteFilter处理。 2. **表达式语言**:Struts2使用OGNL(Object-...

    struts1.2 jar包

    Struts1.2是一款历史悠久且广泛使用的Java Web框架,它基于Model-View-Controller(MVC)设计模式,为开发人员提供了构建动态、数据驱动的Web应用的强大工具。该框架在2004年首次发布,是Apache软件基金会的一个项目...

    struts1.2标签实例

    Struts1.2标签库包含了一系列与ActionForm、Action、Message资源、表单验证、国际化等相关的标签,这些标签使得开发者能够更高效地构建用户界面。例如,`&lt;s:textfield&gt;`用于创建输入字段,`&lt;s:submit&gt;`用于提交表单...

    struts1.2 from表单提交包含list的对象

    在Struts1.2中,这个请求会被Struts的ActionServlet捕获,ActionServlet会根据配置的Struts配置文件(struts-config.xml)来决定调用哪个Action类来处理请求。 对于包含列表的表单,用户可能需要在页面上输入多条...

    struts 1.2驱动包

    Struts 1.2驱动包是Apache软件基金会开发的一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。它旨在提供一个结构化的、可扩展的平台,帮助开发者构建更易于维护和管理的Web应用。Struts 1.2...

    Struts 1.2 API详细讲解.rar

    Struts 1.2 是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,由Apache软件基金会开发。它极大地简化了构建动态、数据驱动的Web应用的过程,提高了开发效率和代码的可维护性。这个压缩包文件...

    struts 1.2 ActionFrom表单验证

    ActionForm是Struts 1.2中用于处理用户输入数据的核心组件,它负责在用户界面(JSP)与控制器(Action)之间传递数据。表单验证是确保用户提交的数据符合业务规则和数据完整性的重要环节。 在Struts 1.2中,...

    struts1.2.jar包

    1. **MVC模式**:Struts1.2遵循MVC设计模式,将应用程序的业务逻辑、视图呈现和用户交互分离开来,使得代码更加模块化,易于维护和测试。模型层处理数据,视图层负责展示,而控制器则协调这两者之间的交互。 2. **...

    struts1.2 简单文件上传例子

    Struts1.2是一个经典的Java Web框架,由Apache软件基金会开发。它提供了MVC(Model-View-Controller)设计模式的实现,使得开发者能够更方便地构建可维护、可扩展的Web应用程序。在这个"struts1.2简单文件上传例子...

    struts 1.2 类库和源码

    Struts 1.2 是一个历史悠久的Java Web框架,由Apache软件基金会开发,它在Web应用开发领域曾经占据了重要的地位。这个压缩包包含了Struts 1.2版本的类库和源码,使得开发者能够方便地研究和学习这个经典框架的工作...

    基于Struts1.2的上传下载Demo

    在Struts1.2中,文件下载通常涉及创建一个Action,该Action负责从服务器读取文件并将其流化到客户端。关键在于设置适当的HTTP响应头,如Content-Disposition和Content-Type,以指示浏览器如何处理响应内容。 以下是...

    struts1.2源代码及文档

    Struts1.2是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。这个框架的主要目的是为了简化Web应用开发,提高开发效率,提供一套标准的方式来处理HTTP...

    struts1.2源码研究

    Struts 1.2 是一款基于 Model-View-Controller(MVC)设计模式的开源Java Web框架,由Apache软件基金会维护。它简化了Java Servlet API的使用,使得开发者能够更专注于业务逻辑,而不是处理HTTP请求的细节。Struts ...

Global site tag (gtag.js) - Google Analytics