【问题标题】:Setting request parts in spring test mvc在spring test mvc中设置请求部分
【发布时间】:2016-08-28 06:45:39
【问题描述】:

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

【问题讨论】:

  • 你如何测试这个?通过调用控制器方法或者您实际上是在使用 MockMvc。如果是后者,你就用错了,如果是前者,你就很难了。
  • 我正在使用 MockMvc。我添加了我正在使用的代码
  • MultipartFile 不是Part,所以这不起作用。您只能添加 MockMvc 目前无法添加的部件和 afaik。您唯一的更改可能是模拟 Part 并通过创建自定义 RequestBuilder 自己添加它。

标签: java spring spring-mvc spring-test spring-mvc-test


【解决方案1】:

Spring MVC 测试框架目前不支持使用javax.servlet.http.Part 进行测试。

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

在此期间,您应该能够自己模拟Part,并通过自定义RequestPostProcessor 在准备好的MockHttpServletRequest 中注册它。

问候,

Sam(Spring TestContext 框架的作者)

【讨论】:

  • 我无法模拟它。在RequestPartServletServerHttpRequest 我遇到了这个:this.headers = this.multipartRequest.getMultipartHeaders(this.partName); if (this.headers == null) { throw new MissingServletRequestPartException(partName); }
  • 嗯...看起来在解决 SPR-14252 和 SPR-14253 之前可能无法轻松完成这项工作。我会将您的 cmets 添加到这些问题中,以便我们考虑您的经验。
  • 仅供参考:我向jira.spring.io/browse/SPR-14252 介绍了进一步分析部分
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 2012-08-12
    • 2020-09-24
    • 2014-02-15
    • 2016-04-03
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多