java - 如何使用 Spring MockMvc 放置多部分/表单数据?

标签 java spring multipartform-data spring-test-mvc mockmvc

我有一个带有 PUT 方法的 Controller 方法,它接收 multipart/form-data:

   @RequestMapping(value = "/putIn", method = RequestMethod.PUT)
   public Foo updateFoo(HttpServletRequest request,
                           @RequestBody Foo foo,
                           @RequestParam("foo_icon") MultipartFile file) {
    ...
   }

我想使用 MockMvc 对其进行测试。不幸的是 MockMvcRequestBuilders.fileUpload 本质上创建了一个 MockMultipartHttpServletRequestBuilder 的实例,它有一个 POST 方法:

super(HttpMethod.POST, urlTemplate, urlVariables)

编辑: 我当然可以 我不能创建自己的MockHttpServletRequestBuilder实现,比如说

public MockPutMultipartHttpServletRequestBuilder(String urlTemplate, Object... urlVariables) {
    super(HttpMethod.PUT, urlTemplate, urlVariables);
    super.contentType(MediaType.MULTIPART_FORM_DATA);
}

因为 MockHttpServletRequestBuilder 有一个包本地构造函数。

但是我想知道有没有更方便的有什么办法可以做到这一点,可能我错过了一些现有的类或方法吗?

最佳答案

是的,有办法,而且也很简单!

我自己也遇到了同样的问题。虽然我对 Sam Brannen 的回答感到灰心,但现在的 Spring MVC 似乎确实支持 PUT 文件上传,因为我可以使用 Postman 简单地执行这样的请求(我使用的是 Spring Boot 1.4.2)。所以,我一直在挖掘,发现唯一的问题是 MockMvcRequestBuilders.fileUpload() 返回的 MockMultipartHttpServletRequestBuilder 具有硬编码为“POST”的方法。然后我发现了 with() 方法...

这让我想出了这个巧妙的小技巧来强制 MockMultipartHttpServletRequestBuilder 无论如何都要使用“PUT”方法:

    MockMultipartFile file = new MockMultipartFile("data", "dummy.csv",
            "text/plain", "Some dataset...".getBytes());

    MockMultipartHttpServletRequestBuilder builder =
            MockMvcRequestBuilders.multipart("/test1/datasets/set1");
    builder.with(new RequestPostProcessor() {
        @Override
        public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
            request.setMethod("PUT");
            return request;
        }
    });
    mvc.perform(builder
            .file(file))
            .andExpect(status().isOk());

像魅力一样工作!

关于java - 如何使用 Spring MockMvc 放置多部分/表单数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571716/

相关文章:

java - C#.NET 和 Java 中的二维数组性能

java - ConcurrentHashMap 的 KeySet 迭代器是线程安全的吗?

java - 为什么这个正则表达式没有给出预期的输出?

Spring框架5和EhCache 3.5

java - 如何拦截 session 结束并获取属性?

java - 如何在java中实现图形数据结构?有现成的图书馆吗?

objective-c - 使用元数据分块发送文件

ios - 在 Swift 中使用 multipart/form-data 上传图像和参数

ios - post方法如何只发送必需的参数objective-c

java - 从 jsr-303 自定义 validator 访问数据库