zoukankan      html  css  js  c++  java
  • Struts 1.2 中如何测试Action

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

    得至关重要。

    在基于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"));
       }
    }

  • 相关阅读:
    RTMP协议在线教育课堂web视频直播点播平台EasyDSS鉴权模块优化说明
    RTMP协议在线教育课堂web视频直播点播平台EasyDSS在大量设备开启录像后为什么会导致系统卡死?
    RTMP协议视频直播点播智能分析平台EasyDSS优化视频水印生成效率参考
    互联网在线课堂直播点播视频平台EasyDSS访问页面报NO DSS SERVICE如何排查?
    RTMP直播点播平台EasyDSS下载录像文件为什么会提示:最大播放下载录像间隔是3小时?
    RTMP协议互联网教育课堂直播点播系统EasyDSS获取直播信息优化设计方案介绍
    如何将RTMP协议视频直播点播平台EasyDSS录像文件存储在其他的空闲磁盘内?
    POJ 3069 Saruman's Army 贪心
    POJ3617 Best Cow line 简单题
    POJ 1852 Ants 思维题 简单题
  • 原文地址:https://www.cnblogs.com/ITEagle/p/1714118.html
Copyright © 2011-2022 走看看