在 spring test mvc 中设置请求部分

Setting request parts in spring test mvc

我正在尝试测试(通过 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 代码,当 getParts() 从另一个列表 (Map<String, Part> parts) 获取元素时,对 file(...) 的调用在 List<MockMultipartFile> 中添加了一个元素

必须有另一种方法...

编辑 1

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

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

Spring MVC 测试框架.

目前不支持使用 javax.servlet.http.Part 进行测试

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

在此期间,您应该能够自己模拟 Part 并通过自定义 RequestPostProcessor.

将其注册到准备好的 MockHttpServletRequest

此致,

Sam(Spring TestContext Framework 的作者)

要详细说明 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