gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:58:03 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com