そんなん出来ないですけどね
なぜ出来ない
MockMvcで使ってるMockRequestDispatcher.javaのforwardを見るとMockHttpServletResponseのsetForwardedUrlに渡してるわけ。
ちなみにWebTestClientもMockRequestDispatcher使ってる。
@Override
public void forward(ServletRequest request, ServletResponse response) {
Assert.notNull(request, "Request must not be null");
Assert.notNull(response, "Response must not be null");
Assert.state(!response.isCommitted(), "Cannot perform forward - response is already committed");
getMockHttpServletResponse(response).setForwardedUrl(this.resource);
if (logger.isDebugEnabled()) {
logger.debug("MockRequestDispatcher: forwarding to [" + this.resource + "]");
}
}
じゃあsetForwardedUrlで何してるかって言うと、URIをStringとして対比してるだけでした。
public void setForwardedUrl(@Nullable String forwardedUrl) {
this.forwardedUrl = forwardedUrl;
}
文字列を持っているだけだからforwardはしないんでしょうねきっと。
仕方ないので擬似的にforwardする
JUnitクラスの親クラスにしょうもないメソッドを作った。
protected MvcResult forwardTest(String url, HttpMethod m) throws Exception {
// フォワード元URL実行
MvcResult r = mockMvc.perform(this.getBuilder(url, m)
.andExpect(status().isOk())
.andReturn();
// フォワードパスを取得する
String forwardUrl = r.getResponce().getForwardUrl();
// HTTPメソッドを取得する
Method method = r.getResponce().getMethod();
// フォワード先URL実行
return forwardReturn = mockMvc.perform(this.getBuilder(forwardUrl, method) //実際はflashAttrなどでフォワード元で設定されたパラメータを渡す
.andExpect(status().isOk())
.andReturn();
}
private MockHttpServletRequestBuilder getBuilder(String url, HttpMethod m) {
// HTTPメソッドごとにビルダーを作って返すような部品
}
あとは好きにAssertions使ってテストを作る。
HTTPのRFCに沿ったつくりなどは意識していないのでその辺りはこのあと投稿する人がやってくれる多分。