其他分享
首页 > 其他分享> > spring – 通过MockMVC测试Form帖子

spring – 通过MockMVC测试Form帖子

作者:互联网

我正在编写测试来验证我可以在我们的API上发布通用表单.

我还添加了一些调试,但我注意到实际表单发布的数据; (邮差/ AngularJS或w / e)不同于做mockMVC测试,如:

MvcResult response = mockMvc
            .perform(post("/some/super/secret/url") //
                    .param("someparam1", "somevalue") //
                    .param("someparam2", "somevalue") //                
                    .contentType(MediaType.APPLICATION_FORM_URLENCODED) //
                    .accept(MediaType.APPLICATION_JSON)) //
            .andExpect(status().isOk()) //
            .andReturn();

配置与生产中运行的配置完全相同,等等.但是当我的拦截器记录内容时,在实际测试(而不是mockMVC)中,内容的格式为“someparam1 = somevalue& etc = encore”

当我打印mockMVC内容时,我实际上似乎没有内容,但请求中有Params,我认为它们像GET参数一样被添加.

有谁知道如何正确测试这个?我遇到了这个问题,因为看起来我们的表单帖子似乎没有被Spring解析,即使我们已经将FormHttpMessageConverter添加到servlet上下文中.

解决方法:

如果你的类路径上有Apache HTTPComponents HttpClient,你可以这样做:

    mockMvc.perform(post("/some/super/secret/url")
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .content(EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList(
                    new BasicNameValuePair("someparam1", "true"),
                    new BasicNameValuePair("someparam2", "test")
            )))));

如果您没有HttpClient,可以使用构造urlencoded表单实体的简单帮助器方法来完成:

    mockMvc.perform(post("/some/super/secret/url")
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .content(buildUrlEncodedFormEntity(
         "someparam1", "value1", 
         "someparam2", "value2"
    ))));

有了这个辅助函数:

private String buildUrlEncodedFormEntity(String... params) {
    if( (params.length % 2) > 0 ) {
       throw new IllegalArgumentException("Need to give an even number of parameters");
    }
    StringBuilder result = new StringBuilder();
    for (int i=0; i<params.length; i+=2) {
        if( i > 0 ) {
            result.append('&');
        }
        try {
            result.
            append(URLEncoder.encode(params[i], StandardCharsets.UTF_8.name())).
            append('=').
            append(URLEncoder.encode(params[i+1], StandardCharsets.UTF_8.name()));
        }
        catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
    return result.toString();
 }

标签:spring,form-data
来源: https://codeday.me/bug/20191006/1859157.html