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


猜你喜欢

转载自wangjinlongaisong-126-com.iteye.com/blog/1165461