使用EasyMock模拟测试Struts2 Action

模拟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 session;

 

 

protected void setUp() {

// 获取一个Mock HttpServletRequest对象

request = EasyMock.createMock(HttpServletRequest.class);

// 获取一个Mock HttpServletResponse对象

response = EasyMock.createMock(HttpServletResponse.class);

session = new HashMap();// 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层初始化,而且你的测试用例代码维护性也很差。

你可能感兴趣的:(test)