模拟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层初始化,而且你的测试用例代码维护性也很差。