前提
- 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個以上→一括送信
こんな感じでいいですかね。ラインは個別に判断しないといけなさそうです。