EasyMock を使った Servlet 単体テストの例
なかなかそういうことする機会自体ないと思うが・・・。
以下のような簡単な Servlet をテストしたい場合。
package easymock; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World"); out.println("</body>"); out.println("</html>"); } }
上記のような request からは何も取らず、response に content-type を設定して、html を吐くだけのシンプルな servlet は以下のようにテストできる。(いろんな方法はあると思うけど)
package easymock; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Test; public class ServletTest { @Test public void test() throws ServletException, IOException { HttpServletResponse res = createMock(HttpServletResponse.class); res.setContentType("text/html; charset=Shift_JIS"); StringWriter out = new StringWriter(); expect(res.getWriter()).andReturn(new PrintWriter(out)); replay(res); new HelloWorldServlet().service(null, res); verify(res); assertEquals( "<html>\n" + "<head>\n" + "<title>Hello World Servlet</title>\n" + "</head>\n" + "<body>\n" + "Hello World\n" + "</body>\n" + "</html>\n" , out.toString()); } }
やったことがある人も多いと思うけど、request, response の Mock を手作りするのは結構面倒くさいので、EasyMock がありがたく感じられる。