正确设置RequestBody的MockHttpServletRequestBuilder

jla*_*s62 3 java spring-mvc

我只是尝试使用a测试Spring控制器方法MockHttpServletRequestBuilder.控制器方法的签名如下所示:

 @RequestMapping(value = "/assignTeamsToUsers", method = RequestMethod.POST)
 public @ResponseBody String assignUsersToTeams(Model model, @RequestBody MultiValueMap<String, String> ids).
Run Code Online (Sandbox Code Playgroud)

在我的测试案例中,我有:

MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();
MockHttpServletRequestBuilder request = createRequest(uri, method);

//set up request object...Not sure how??
//My current attempt:
     String body = "userIds[]=0&teamIds[]=0";
     request.content(body);
     request.accept(MediaType.ALL);
     request.contentType(MediaType.APPLICATION_FORM_URLENCODED);

ResultActions resultActions = mockMvc.perform(request);
Run Code Online (Sandbox Code Playgroud)

编辑:显示createRequest.method="POST"

private MockHttpServletRequestBuilder createRequest (String uri, String method) {
    MockHttpServletRequestBuilder builder = null;

    if("GET".equalsIgnoreCase(method))
        builder = MockMvcRequestBuilders.get(uri);
    else if("POST".equalsIgnoreCase(method))
        builder = MockMvcRequestBuilders.post(uri);
    else
        Assert.fail("Unsupported method!");

    //We always create requests for user Manager
    builder.header("securityRole", Role.Manager.getDisplayName());

    return builder;

}
Run Code Online (Sandbox Code Playgroud)

我知道uri和方法是正确的.我的问题是我从Spring 获得了415错误代码.基本上,我不知道如何设置request对象有适当@RequestBodyMultiValueMap.我已经尝试了很多设置request.content的变体,设置request.accept,request.contentType,request.characterEncoding,并且仍然每次我得到415错误.

如果有任何帮助,我可以使用Web界面成功发布到此端点,以下是chrome中的请求:

在此输入图像描述

jla*_*s62 6

我最后通过执行以下操作解决了这个问题:

MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post("whatever url");
request.contentType(MediaType.APPLICATION_FORM_URLENCODED);

//set key value pairs
//also the keys do not have to be unique, two keys of the same value will both get added 
request.param("key", "value");

MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();
ResultActions resultActions = mockMvc.perform(request);
// make sure response is valid
Run Code Online (Sandbox Code Playgroud)

希望这可以引导其他人走向正确的方向.谢谢