MoChiwakiブログ

女性エンジニアがゆる~く書く備忘録ブログ 〜だいたいいつもつまづいている〜

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と戦っていた。。