忍者ブログ

MockMvcのgetRequestURLとgetServletPathに任意の値を指定する方法

2017年08月16日 20時49分32秒
SpringのMockMvcを使用してJUnitを実行しています。
Servletのロジック内で
HttpServletRequestのgetRequestURLgetServletPathを使用しているのですが、JUnitで単体テストすると、getRequestURLのホスト名がlocalhost、getServletPathが空で返ってきて困りました。
いや、別にlocalhostでも空でもいいっちゃぁいいんですが、どうせなら本番環境に近い状態でテストしたい。

なので、getRequestURLとgetServletPathに任意の値(本番環境と同じホスト名、パス)を返すように設定する方法を調査。
MockMvcを色々触ってみたら出来たのでメモ。

RequestPostProcessorをimplementsした新規クラスを作成

import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.web.servlet.request.RequestPostProcessor;

public class TestRequestPostProcessor implements RequestPostProcessor {
  private String serverName = null;
  private String servletPath = null;

  public TestRequestPostProcessor(String _serverName, String _servletPath)
  {

      this.serverName = _serverName;
      this.servletPath = _servletPath;
  }

  @Override
  public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request)
  {

      request.setServerName(serverName);
      request.setServletPath(servletPath);
      // 他に設定したい項目があればここで編集
      return request;
  }
}


テストコードに新規作成クラスを指定

@Test
public void テスト() throws Exception {
  String hostName = "hostname.co.jp";
  String servletPath = "/test/hoge";
  mockMvc.perform(get(servletPath)
      .with(new TestRequestPostProcessor(hostName, servletPath))
      .session(mockSession)
      .param("hoge1", "hogehoge"))
      .andExpect(status().isOk());
}

これでJUnitを実行すれば、
getRequestURL()はhttp://hostname.co.jp/test/hoge
getServletPath()は/test/hoge
を返してくれるようになりました。


PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字