MockMvcのgetRequestURLとgetServletPathに任意の値を指定する方法
2017年08月16日 20時49分32秒
SpringのMockMvcを使用してJUnitを実行しています。
Servletのロジック内でHttpServletRequestのgetRequestURLとgetServletPathを使用しているのですが、JUnitで単体テストすると、getRequestURLのホスト名がlocalhost、getServletPathが空で返ってきて困りました。
いや、別にlocalhostでも空でもいいっちゃぁいいんですが、どうせなら本番環境に近い状態でテストしたい。
なので、getRequestURLとgetServletPathに任意の値(本番環境と同じホスト名、パス)を返すように設定する方法を調査。
MockMvcを色々触ってみたら出来たのでメモ。
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
を返してくれるようになりました。
Servletのロジック内でHttpServletRequestのgetRequestURLとgetServletPathを使用しているのですが、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;
}
}
テストコードに新規作成クラスを指定
@Testpublic 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