在 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
我正在尝试测试(通过 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