0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MockMvcで擬似的なForwardのテストをする

Last updated at Posted at 2024-06-24

そんなん出来ないですけどね

なぜ出来ない

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に沿ったつくりなどは意識していないのでその辺りはこのあと投稿する人がやってくれる多分。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?