如何使用Spring MockMvc输入多部分/表单数据?

我有一个带有PUT方法的控制器方法,该方法接收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)。因此,我一直在挖掘,发现唯一的问题是事实所MockMultipartHttpServletRequestBuilder返回MockMvcRequestBuilders.fileUpload()的方法将方法硬编码为“

POST”。然后我发现了with()方法…

这使我想出了这个巧妙的小窍门,以强制MockMultipartHttpServletRequestBuilder无论如何都要使用“ PUT”方法:

    MockMultipartFile file = new MockMultipartFile("data", "dummy.csv",

"text/plain", "Some dataset...".getBytes());

MockMultipartHttpServletRequestBuilder builder =

MockMvcRequestBuilders.fileUpload("/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().ok());

奇迹般有效!

以上是 如何使用Spring MockMvc输入多部分/表单数据? 的全部内容, 来源链接: utcz.com/qa/400496.html

回到顶部