使用EasyMock测试Servlet

通常我们可以通过junit来对程序进行单元测试,但是单元的测试代码往往依赖于其他单元,如运行一个HttpServletRequest处理器的测试代码必须启动一个servlet容器。所有这些问题,都可以使用Mock Object来解决。
EasyMock提供了很方便的测试servlet的方法,基本步骤是
基本使用步骤
创建Mock对象的控制对象Control

从控制对象中获取所需要的Mock对象。

记录测试方法中所使用到的方法和返回值。

设置Control对象到“回放”模式。

进行测试。

在测试完毕后,确认Mock对象已经执行了刚才定义的所有操作。

[color=blue]下载地址 http://www.easymock.org
这里使用的是easymock2.0 for j2se5.0
使用例子

LoginServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// check username & password:
if("admin".equals(username) && "123456".equals(password)) {
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getNamedDispatcher("dispatcher");
dispatcher.forward(request, response);
}
else {
throw new RuntimeException("Login failed.");
}
}

}



对以上的servlet进行测试
java代码

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.*;
import static org.easymock.EasyMock.*;
import junit.framework.TestCase;

public class LoginServletTest extends TestCase {

public void testLoginFailed() throws Exception {
LoginServlet servlet = new LoginServlet();
HttpServletRequest request = createMock(HttpServletRequest.class);
expect(request.getParameter("username")).andReturn("admin");
expect(request.getParameter("password")).andReturn("1234");
replay(request);
try {
servlet.doPost(request, null);
fail("Not caught exception!");
} catch (RuntimeException re) {
assertEquals("Login failed.", re.getMessage());
}
verify(request);
}

public void testLoginOK() throws Exception {
// create mock:
HttpServletRequest request = createMock(HttpServletRequest.class);
final ServletContext contextObj = createMock(ServletContext.class);
RequestDispatcher dispatcherObj = createMock(RequestDispatcher.class);

// set behavior:
expect(request.getParameter("username")).andReturn("admin");
expect(request.getParameter("password")).andReturn("123456");
expect(contextObj.getNamedDispatcher("dispatcher")).andReturn(
dispatcherObj);
dispatcherObj.forward(request, null);

// done!
replay(request);
replay(contextObj);
replay(dispatcherObj);

// test:
LoginServlet servlet = new LoginServlet() {

private static final long serialVersionUID = 1L;

public ServletContext getServletContext() {
return contextObj;
}
};
servlet.doPost(request, null);
// verify:
verify(request);
verify(contextObj);
verify(dispatcherObj);

}
}[/color]

以上代码在eclipse 3.1+easymock2.0下测试通过
其中
expect(request.getParameter("username")).andReturn("admin")表示将username参数的返回值设为"admin".
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值