通常我们可以通过junit来对程序进行单元测试,但是单元的测试代码往往依赖于其他单元,如运行一个HttpServletRequest处理器的测试代码必须启动一个servlet容器。所有这些问题,都可以使用Mock Object来解决。
EasyMock提供了很方便的测试servlet的方法,基本步骤是
基本使用步骤
创建Mock对象的控制对象Control
从控制对象中获取所需要的Mock对象。
记录测试方法中所使用到的方法和返回值。
设置Control对象到“回放”模式。
进行测试。
在测试完毕后,确认Mock对象已经执行了刚才定义的所有操作。
[color=blue]下载地址 http://www.easymock.org
这里使用的是easymock2.0 for j2se5.0
使用例子
对以上的servlet进行测试
java代码
以上代码在eclipse 3.1+easymock2.0下测试通过
其中
expect(request.getParameter("username")).andReturn("admin")表示将username参数的返回值设为"admin".
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".