若手SEを救いたい社畜の手記

わかすくしゅき

MockMvc#performのPOSTで複数のform情報を送信する方法

前提

  • SpringMVC 5.1.16
  • Java11
  • Junit4
  • SpringTest 5.1.16

結論

MockMvc#performに指定するMockHttpServletRequestBuilderのparamまたはparamsを使いましょう。

paramsの場合、正確には以下のような構文になります。

MockMvcRequestBuilders.post("/sample").params(request)

変数requestの中に送信したいform情報を詰め込みます。

概要

SpringMVCのControllerのテストはSpringTestとJUnitの組み合わせでやるのが一般的だと思います。

Controller側が以下のようなフォームで待ち受けているとき

  • ユーザーID(userid)
  • ユーザー名(username)
  • 社員番号(empno)
    カッコ内はリクエスト項目名

mockMvc.performを使用して上記のフォーム情報を送信するには個別送信と一括送信が使用できます。

個別送信

paramメソッドを使って1個ずつ指定してやります。

mockMvc.perform(
MockMvcRequestBuilders.post("/sample").param("userid","user-01").param("username","TARO").param("empno","1365992")
)

項目数が増えたりするとめんどくさそうです・・・・

一括送信

paramsを使ってまとめて指定します。

MultiValueMap<String, String> request = new LinkedMultiValueMap<String, String>();
List<String> list = new ArrayList<String>();
list.add("1365992");
request.put("empno",list);
List<String> list2 = new ArrayList<String>();
list2.add("user-01");
request.put("userid",list2);
List<String> list3 = new ArrayList<String>();
list3.add("TARO3");
request.put("username",list3);

mockMvc.perform(
MockMvcRequestBuilders.post("/sample").params(request)
)

リストを個別に作ってあげるの大変ですね・・・・

感想

どちらの場合も使い勝手的にはいまいちでしたね。

  • formの項目数が3個以下→個別送信
  • formの項目数が4個以上→一括送信

こんな感じでいいですかね。ラインは個別に判断しないといけなさそうです。

  • B!