EasyMock を使った Servlet 単体テストの例 その2
次は request, response、両方の値を参照している(つまり Mock が2つある)パターン。2つあっても基本的には一緒。並べるだけである。
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 doPost(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 " + request.getParameter("name")); out.println("</body>"); out.println("</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 test2() throws ServletException, IOException { HttpServletRequest req = createMock(HttpServletRequest.class); HttpServletResponse res = createMock(HttpServletResponse.class); expect(req.getParameter("name")).andReturn("kamei"); res.setContentType("text/html; charset=Shift_JIS"); StringWriter out = new StringWriter(); expect(res.getWriter()).andReturn(new PrintWriter(out)); replay(req, res); new HelloWorldServlet().doPost(req, res); verify(req, res); assertEquals( "<html>\n" + "<head>\n" + "<title>Hello World Servlet</title>\n" + "</head>\n" + "<body>\n" + "Hello kamei\n" + "</body>\n" + "</html>\n" , out.toString()); } }
大体のやつはいけそうな気がするんだけど、どうか。
ちなみに、「setContentType() が呼ばれてさえ居れば、中身の文字列とかどうでもいいんですけど!」って場合は、
res.setContentType(isA(String.class));
って書くことも出来る。