ServletテストとMockito
Servletのテスト方法
例えばこんなServletがあります。
DaoからDBのListを持ってくるServletクラス
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("UTF-8"); //DaoクラスからなんかのList取ってくる Dao dao = new Dao(); List<Dto> list = dao.Check(); request.setAttribute("list", list); request.getRequestDispatcher("/jsp/check_list.jsp").forward(request,response); }
ServletのdoPostメソッドをテストなので
requestとresponseを渡さなければいけません。
さらにvoidという戻り値がないくせもの!
そこで登場 Mockito さん!!
もっく伊藤さーん!!
説明しよう!
彼はテストで毎回のように出てくる頼もしい助っ人
(名前からして助っ人外国人?!)
「このメソッドだけテストしたいのに他のメソッドも起動させないといけないなんて…」 という声を聞くと登場してくれるだろう
テストでは必要のないメソッドをMock化して呼び出すと、
指定のものを返してくれるというなんとも律儀な人なのだ
public class ServletTest { @Test public void doPostTest() throws ServletException, IOException{ // request responseをmock化 HttpServletRequest request = mock(HttpServletRequest.class); HttpServletResponse response = mock(HttpServletResponse.class); // Daoの中まで行く必要ないのでmock化 Dao dao = mock(Dao.class); when(dao.Check()).thenReturn(new ArrayList<Dto>()); // RequestDispatcherをrdに入れてmock化 RequestDispatcher rd = mock(RequestDispatcher.class); // rdのforwardが呼ばれたらnothingを返すっていう設定(whenはvoidメソッド使えない) doNothing().when(rd).forward(request, response); // getRequestDispatcherが呼ばれたらとりあえずrd返すっていう設定(→この戻り値ほしいが為にmock化した) when(request.getRequestDispatcher("/jsp/check_list.jsp")).thenReturn(rd); new ListServlet().doPost(request, response); // ちゃんとこの↓メソッドたち呼ばれているか確認(time(1)で一度だけ呼ばれたってこと) verify(response).setContentType("text/html;charset=UTF-8"); verify(request, times(1)).getRequestDispatcher(anyString()); } }
最後のRequestDispatcherが呼ばれてればこのメソッドちゃんと通ってるってことでしょ!
これ書いたの先週なのに
昨日はRequestDispatcherをmock化忘れてて
ずっとNullPointerと戦っていた。。