使用EasyMock模拟测试Struts2 Action

转载 2012年03月30日 16:22:07

模拟http请求,调用处理方法,响应数据。

为了更好的测试代码的正确性,为了更完整的测试,我们使用easymock模拟 ServletHtppRequest,ServletHttpResponse。

 mock使用jar包为:  easymock-3.0.jar 、 cglib-2.2.jar、 asm-3.1.jar

 一般使用struts2项目,都会建一个BaseAction,使用struts2的自动注入ServletHttpRequest,ServletHttpResponse,Application ,在具体的action中可以直接使用以上对象。

LoginAction:

import java.util.ArrayList;

import java.util.List;

 

import org.apache.log4j.Logger;

 

import org.springframework.dao.DataAccessException;

import com.wtyt.returnedMoney.baseclass.BaseAction;

import com.wtyt.returnedMoney.bean.ResultBean;

import com.wtyt.returnedMoney.bean.UserBean;

import com.wtyt.returnedMoney.login.dao.LoginDao;

import com.wtyt.returnedMoney.publicclass.Constants;

import com.wtyt.returnedMoney.util.StartUp;

 

public class LoginAction extends BaseAction {

private static final long serialVersionUID = 1L;

private final static Logger logger = Logger.getLogger(LoginAction.class);

 

public String execute() throws Exception {

logger.info("进入LogonAction");

String loginName = request.getParameter("loginName");

String password = request.getParameter("password");

 String page = "";

if(loginName!=null&&"test".equals(loginName )&&password !=null&&"test".equals(password )){

      logger.info(”登录成功“);

     session.put(Constants.USER_KEY, loginName );

    return SUCCESS;

}else{

    logger.info("用户名密码错误");

     request.setAttribute("result", "用户密码错误");

return ERROR;

  }

}

}

使用Junit4的进行单元测试

   使用mock 一般有4个步骤

        1.初始化Mock对象

         2.预置mock对象的行为

         3.设置mock对象的回放模式

         4.验证mock的对象预置行为是否都执行

 测试肯定需要造数据比对数据等等,这里不在叙述,指介绍easymock的使用

 

package com.wtyt.returnedMoney.test.login;

 

import java.sql.SQLException;

import java.util.HashMap;

import java.util.Map;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.wtyt.returnedMoney.bean.ResultBean;

import com.wtyt.returnedMoney.bean.UserBean;

import com.wtyt.returnedMoney.login.action.LoginAction;

import com.wtyt.returnedMoney.publicclass.Constants;

import com.wtyt.returnedMoney.test.BaseCase;

 

import com.wtyt.returnedMoney.test.db.Config;

import com.wtyt.returnedMoney.test.db.DbInit;

import com.wtyt.returnedMoney.util.StartUp;

 

 

 

public class TestLoginAction extends BaseCase {

 

public TestLoginAction(String name) {

super(name);

}

private HttpServletRequest request;

private HttpServletResponse response;

private Map<String, Object> session;

 

 

protected void setUp() {

// 获取一个Mock HttpServletRequest对象

request = EasyMock.createMock(HttpServletRequest.class);

// 获取一个Mock HttpServletResponse对象

response = EasyMock.createMock(HttpServletResponse.class);

session = new HashMap<String, Object>();// struts2 的session的是个Map

}

 

protected void tearDown() {

    // 验证mock的预置行为是否执行

EasyMock.verify(request,response);

}

// 1\分公司经理用户输入正确的密码登录系统

public void _test_one() throws Exception {

     // 设置预置行为,具体行为视测试方法而定

EasyMock.expect(request.getParameter("loginName")).andReturn("test").once();

EasyMock.expect(request.getParameter("password")).andReturn("test").once();

    // 设置回放 如果不设置回放模式,mock对象的预置行为无法调用

EasyMock.replay(request,response);

      // 初始化action ,就是把mock对象放入action中

LoginAction loginAction = new LoginAction ();// (LoginAction) StartUp.factory.getBean("loginAction"); 这里使用了spring的加载

loginAction.setServletRequest(request);

loginAction.setServletResponse(response);

loginAction.setSession(session);

 // 调用action的方法 即测试方法

String returnValue = loginAction.execute();

 // 验证返回结果

assertEquals("TestLogin","successrm_user_page", returnValue);

String loginName= (StringUserBean) session.get(Constants.USER_KEY);

assertNotNull("登录成功session错误 ", loginName);

assertEquals("登录成功用户名session保存错误", "test",loginName);

}

 

}

 这里需要提醒的是:

         1.代码中含有request 的 setAttribute 方法,这里需要设置预置行为;设置预置行为时要放入具体的值,EaseMock会调用你放入对象的 equals 方法来比对放入的对象是否一致,所以你必须重写equals方法;当然,强烈建议不要使用setAttribute ,因为struts2提供更好的传参方法。

         2.如果使用spring的ioc控制action了,不能直接使用new 拿到action对象,要使用spring的容器加载比较方便些,不然你还要手动把使用的dao或者是service层初始化,而且你的测试用例代码维护性也很差。

struts2与mockhttprequest

一:postprotected ApplicationContext ctx=new ClassApplicationContext("Application-context.xml");MyActi...

使用struts2 - junit - plugin - *.jar对Action进行测试

1. 使用StrutsTestCase测试 Account.java: package cn.wang.struts; public class Account { private S...
  • draglf
  • draglf
  • 2011年09月27日 20:50
  • 739

单元测试Struts2Spring项目的Action和Service(包含源码)

最近,认真实践了单元测试Struts2、Spring等Java项目,今天特意写的是单元测试Struts2Spring项目的Action和Service。 由于已经写过不少Web开发框架单元测试的代...

Struts2 Action的单元测试

对Struts2进行单元测试,以struts 2.2.1.1为例 ,可以使用struts2发行包中的struts2-junit-plugin-2.2.1.1.jar,它里面提供了两个类StrutsTe...

junit 对struts2的action测试

首先抽象一个生成action的工具类,需要用到spirng的一些jar import java.util.HashMap;import java.util.Map;import javax.servl...

单元测试Struts2的Action(包含源码)

很久没有从头搭建Struts2的环境了。最近,认真实践了单元测试Struts2、Spring等Java项目。 今天特意写的是单元测试Struts2的Action,遇到了不少问题,果然是实践出真知啊。 ...

struts2的action接受参数:可以决定用不用写getter/setter方法(未经过测试)

struts2中action接收参数的方式主要有以下三种:  1.使用action的属性接收参数:在action类中定义属性,创建getter和setter方法;  2.使用DomainModel...

Struts2环境搭建、创建Action并测试启动、核心文件介绍、配置文件连接点详述

一、搭建Struts2环境步骤 1、下载相关Jar包 A、Apache Struts官方网站 http://struts.apache.org/ http://people.apache.org/bu...
  • Ashes18
  • Ashes18
  • 2017年03月06日 10:53
  • 787

单元测试Struts2Spring项目的Action和Service(包含源码)

最近,认真实践了单元测试Struts2、Spring等Java项目,今天特意写的是单元测试Struts2Spring项目的Action和Service。 由于已经写过不少Web开发框架单元测试的代码,...

搬运工 Struts2 Action的单元测试

对Struts2进行单元测试,以struts 2.2.1.1为例 ,可以使用struts2发行包中的struts2-junit-plugin-2.2.1.1.jar,它里面提供了两个类StrutsTe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用EasyMock模拟测试Struts2 Action
举报原因:
原因补充:

(最多只允许输入30个字)