我有一个带有 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/