5

我正在尝试(通过 Spring 测试(mvc))测试一个使用servletRequest.getParts()

到目前为止,我所读到的MockMvcRequestBuilders.fileUpload().file()就是解决方案。但是我不能让它工作。我写了以下失败的测试

MockMultipartHttpServletRequestBuilder builder = MockMvcRequestBuilders.fileUpload("/foo")
            .file(new MockMultipartFile("file", new byte[] { 1, 2, 3, 4 }));
MockHttpServletRequest rq = builder.buildRequest(null);
Assert.assertEquals(1, rq.getParts().size()); // result 0

我浏览了spring代码,并调用了在何时从另一个列表中获取其元素时file(...)添加一个元素List<MockMultipartFile>getParts()(Map<String, Part> parts)

必须有另一种方法来做到这一点......

编辑 1

我用来测试控制器的代码是:

ResultActions result = mockMvc.perform(
            MockMvcRequestBuilders.fileUpload(new URI("/url")).file("param", "expected".getBytes()))
4

2 回答 2

5

当前不支持javax.servlet.http.PartSpring MVC 测试框架中进行测试。

因此,我引入了两张票来解决 Spring Framework 5.0 中的这个缺点:

在此期间,您应该能够模拟Part自己并MockHttpServletRequest通过 custom将其注册到准备好的中RequestPostProcessor

问候,

Sam(Spring TestContext 框架的作者

于 2016-05-05T11:47:31.677 回答
0

详细说明 Sam Brannens 的回答:您可以按如下方式进行:

创建一个 MockPart(而不是 MockMultipartFile)并使用 part() 而不是 file() 添加它;例如:

MockPart coverPart = new MockPart("file", "1.png", Files.readAllBytes(Paths.get("images/1.png")));
coverPart.getHeaders().setContentType(MediaType.IMAGE_PNG);

并在 perform() 中使用它:

mockMvc.perform(multipart("/some/url")
    .part(coverPart)
    .contentType(MediaType.MULTIPART_FORM_DATA)
    .andExpect(status().isOk())

然后在您的控制器中,您将看到 request.getParts() 将包含一个名为“文件”的部分,您可以使用例如 part.getInputStream() 检索内容。

我使用以下依赖项进行测试: org.springframework:spring-test:5.3.14 包含在 org.springframework.boot:spring-boot-starter-test:2.6.2

于 2022-01-05T11:30:20.147 回答