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