`
dong_ta
  • 浏览: 13286 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

基于StrutsTestCase的单元测试(Action测试方法)

阅读更多
采用Struts中的Mock方式模拟action和actionForm进行测试
基础类:STCRequestProcessor
作用:Ioc 将模拟的Action,ActionForm注入到struts-config.xml中的相应的action位置

package test.sample.service.util;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.util.RequestUtils;

/** *//**
 * @author administrator
 *
 * To change this generated comment edit the template variable "typecomment":
 * Window>Preferences>Java>Templates.
 * To enable and disable the creation of type comments go to
 * Window>Preferences>Java>Code Generation.
 */
public class STCRequestProcessor extends RequestProcessor {

    private static HashMap mockActionFormMap = new HashMap();
    private static HashMap mockActionMap = new HashMap();

    public static void addMockAction(String actionStr, String className) 
    {
        mockActionMap.put(actionStr, className);
    }
    public static void addMockActionForm(String actionFormStr,String className)
    {    
        mockActionFormMap.put(actionFormStr, className);
    }
    /** *//**
     * We will insert Mock ActionForm for testing through this method
     */
    protected ActionForm processActionForm(
        HttpServletRequest request,
        HttpServletResponse response,
        ActionMapping mapping) {

        
        // Create (if necessary a form bean to use
        String formBeanName = mapping.getName();
        String mockBeanClassName = (String) mockActionFormMap.get(formBeanName);
        if (mockBeanClassName == null)
            return super.processActionForm(request, response, mapping);

        ActionForm instance = null;
        try {
            Class formClass = Class.forName(mockBeanClassName );
            instance = (ActionForm) formClass.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        instance.setServlet(servlet);
        if (instance == null) {
            return (null);
        }

        if (log.isDebugEnabled()) {
            log.debug(
                " Storing ActionForm bean instance in scope '"
                    + mapping.getScope()
                    + "' under attribute key '"
                    + mapping.getAttribute()
                    + "'");
        }
        if ("request".equals(mapping.getScope())) {
            request.setAttribute(mapping.getAttribute(), instance);
        } else {
            HttpSession session = request.getSession();
            session.setAttribute(mapping.getAttribute(), instance);
        }
        return (instance);

    }

    /** *//**
     * We will insert Mock Action Class through this method
     */
    protected Action processActionCreate(
        HttpServletRequest request,
        HttpServletResponse response,
        ActionMapping mapping)
        throws IOException {
        String orignalClassName = mapping.getType();
        String mockClassName = (String)mockActionMap.get(orignalClassName);
        if( mockClassName == null )
            return super.processActionCreate(request,response,mapping);
        String className = mockClassName;        
        if (log.isDebugEnabled()) {
            log.debug(" Looking for Action instance for class " + className);
        }

        Action instance = null;
        synchronized (actions) {

            // Return any existing Action instance of this class
            instance = (Action) actions.get(className);
            if (instance != null) {
                if (log.isTraceEnabled()) {
                    log.trace("  Returning existing Action instance");
                }
                return (instance);
            }

            // Create and return a new Action instance
            if (log.isTraceEnabled()) {
                log.trace("  Creating new Action instance");
            }

            try {
                instance = (Action) RequestUtils.applicationInstance(className);
            } catch (Exception e) {
                log.error(
                    getInternal().getMessage("actionCreate", mapping.getPath()),
                    e);

                response.sendError(
                    HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                    getInternal().getMessage(
                        "actionCreate",
                        mapping.getPath()));

                return (null);
            }

            instance.setServlet(this.servlet);
            actions.put(className, instance);
        }

        return (instance);
    }

}


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名称

package test.sample.service.action;


import java.io.File;

import servletunit.struts.MockStrutsTestCase;
import test.sample.service.util.STCRequestProcessor;
/** *//**
 * 
-  setContextDirectory,设置web应用的根 
-  setRequestPathInfo,设置request的请求 
-  addRequestParameter,将参数和对应的值加入request中 
-  actionPerform,执行这个请求 
-  verifyForward,验证forward的名字是否正确 
-  verifyForwardPath,验证forward的path是否正确 
-  verifyNoActionErrors,验证在action执行过程中没有ActionError产生 
-  verifyActionErrors,验证在action执行过程中产生的ActionError集合的内容 
 * @author donganlei
 *
 */
public class MockWordActionTest extends MockStrutsTestCase {
    
    public void testInvalidPageflag1()throws Exception{
          addRequestParameter("reqCode","getWordList");
          addRequestParameter("pageflag","userquery");
          actionPerform();
          verifyNoActionErrors();
          verifyForward("querylist");
    }
    
    public void testInvalidPageflag2()throws Exception{
          addRequestParameter("reqCode","getWordList");
          addRequestParameter("pageflag","seatquery");
          actionPerform();
          verifyNoActionErrors();
          verifyForward("querylist");
    }
    
    public void testInvalidInitUpdate()throws Exception{
          addRequestParameter("reqCode","initUpdate");
          actionPerform();
          verifyNoActionErrors();
          verifyForward("update");
    }
    public void testinitUpdate()throws Exception{
          addRequestParameter("reqCode","initUpdate");
          addRequestParameter("wordid","3");
          addRequestParameter("roomid","3");
          actionPerform();
          verifyNoActionErrors();
          verifyForward("update");
    }
    protected void setUp() throws Exception {
        super.setUp();
        File web = new File("E:/project/portal/WebContent");
        this.setContextDirectory(web);
        setConfigFile("/WEB-INF/web.xml");
        setConfigFile("/WEB-INF/struts-config.xml");
        STCRequestProcessor.addMockActionForm("ser_wordForm", "test.sample.service.form.MockWordForm");
        STCRequestProcessor.addMockAction("com.huawei.service.action.WordAction","test.sample.service.action.MockWordAction");
        setRequestPathInfo("/service/word");
    }
    public static void main(String args[]){
        junit.textui.TestRunner.run(MockWordActionTest.class);
    }  
}


Struts-congfig.xml中的processorClass
<controller>
      <set-property property="processorClass" value="test.sample.service.util.STCRequestProcessor"/>
</controller>
分享到:
评论

相关推荐

    StrutsTestCase工程例子

    这个工程例子是基于StrutsTestCase的,它提供了实际操作和理解StrutsTestCase如何工作的实例。 在Struts应用程序中,Action类是处理用户请求的核心组件,通常负责业务逻辑的调用和视图的转发。然而,由于Struts的...

    StrutsTestCase-2.1.4(含文档、源码、官方示例).rar

    StrutsTestCase是Apache Struts框架的一个扩展,它提供了一种集成测试工具,使得开发者能够方便地对基于Struts的应用程序进行单元测试和功能测试。这个压缩包“StrutsTestCase-2.1.4(含文档、源码、官方示例).rar...

    struts1&struts2

    - **Struts2** 提供了更好的测试支持,Action可以通过设置属性、初始化和调用方法进行单元测试,依赖注入使得测试更加简单。 7. **输入数据处理** - **Struts1.x** 使用ActionForm对象捕获用户输入,ActionForm...

    JakartaStrutsLive

    #### 使用StrutsTestCase测试Action - **Mock模式**:解释如何在Mock模式下使用StrutsTestCase进行测试。 - **Cactus模式**:介绍Cactus模式下的StrutsTestCase使用方法。 #### 使用jWebUnit测试JSP - **功能测试**...

    Struts1和Struts2的区别和对比

    Struts1的Action由于暴露了Servlet API,测试需要在容器内进行,通常依赖于StrutsTestCase这样的工具。然而,Struts2的Action可以通过依赖注入轻松地进行单元测试,Action的属性可以被初始化和设置,使得测试更加...

    Struts2和Struts1的一些区别

    - **单元测试的支持**:在Struts1中,由于Action对象与Servlet API紧密耦合,因此对其进行单元测试时通常需要模拟整个Web环境,例如使用StrutsTestCase库提供的Mock对象。而在Struts2中,Action对象更加独立,可以更...

    struts1和struts2的区别

    - **Struts2**:Action类不直接依赖容器,而是通过简单的Maps表示Servlet上下文,更容易进行单元测试。 4. **测试性** - **Struts1**:由于execute方法直接暴露Servlet API,测试较为困难,需要第三方扩展如...

    Jakarta Struts Live

    3. **使用StrutsTestCase测试Action** - 解释StrutsTestCase的用途。 - 通过步骤演示如何利用StrutsTestCase进行测试。 4. **使用jWebUnit测试JSP** - 介绍jWebUnit工具的特点。 - 演示如何使用jWebUnit进行...

    struts面试题大全.doc

    - ActionForms不易用,不支持单元测试,需要依赖StrutsTestCase进行集成测试。 2. **实现MVC的方式**: - Struts使用JSP作为视图(View),ActionServlet作为控制器(Controller),JavaBeans作为模型(Model)。 - ...

    struts1.x和struts2.x区别

    相比之下,Struts2.x提供了更为灵活的测试机制,可以通过Mock对象轻松地进行单元测试,同时也支持集成测试,提高了测试的便捷性和有效性。 #### 表单处理和数据绑定 Struts1.x使用ActionForm作为表单数据的容器,...

    精通Struts基于MVC的Java Web设计与开发 孙卫琴 光盘

    内容推荐 Struts是目前非常流行的基于MVC的Java ...第19章到第21章介绍了如何采用第三方软件,如Apache Common Logging API、Log4J、ANT和StrutsTestCase,来控制Struts应用的输出日志、管理以及测试Struts应用项目。

    精通 Struts:基于 MVC 的 JavaWeb 设计与开发(PDF)

    Struts是目前非常流行的基于MVC的Java Web框架。...第19章到第21章介绍了如何采用第三方软件,如Apache Common Logging API、Log4J、ANT和StrutsTestCase,来控制Struts应用的输出日志、管理以及测试Struts应用项目。

    struts1与struts2的区别

    - **Struts2**:Action可以通过实例化进行测试,属性设置后直接调用方法,依赖注入使得测试更加容易。 5. **接受输入**: - **Struts1**:使用ActionForm对象捕获用户输入,ActionForm需要继承基类,有时会导致...

    Struts的高级应用

    4. **StrutsTestCase**:StrutsTestCase是Struts提供的一个单元测试框架,它允许开发者对ActionForm、Action和ActionForward进行测试,确保这些组件在实际运行前功能正确。使用StrutsTestCase,可以编写模拟HTTP请求...

    struts-2.5.12

    10. **测试与调试**:Struts 2提供了测试工具和API,如StrutsTestCase,便于开发者进行单元测试和集成测试。同时,其丰富的日志记录功能也有助于调试和诊断问题。 总之,Struts 2.5.12是一个功能强大且成熟的Web...

Global site tag (gtag.js) - Google Analytics