读书人

运用EasyMock测试Servlet

发布时间: 2012-06-29 15:48:47 作者: rapoo

使用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.javaimport 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".


读书人网 >行业软件

热点推荐