1

我有一个集成测试,它在我的控制器上发出请求(上传文件)。该测试无需设置任何 CommonsMultipartResolver 即可工作。但是在我必须设置生产环境的那一刻,我必须添加 CommonsMultipartResolver。但这有副作用,我的测试不起作用。同样,生产需要xml配置,而不是测试。我知道可以为测试和生产环境定义配置文件。还有没有其他可能性没有个人资料?

multipartresolver 的配置很简单:

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
    p:maxUploadSize="1000000000">
</bean>

我的测试也很简单:

MockMultipartFile aFileObject = new MockMultipartFile("file", "filename.txt", "text/plain", "a File message".getBytes());
HashMap<String, String> contentTypeParams = new HashMap<String, String>();
contentTypeParams.put("boundary", "xyz");
MediaType mediaType = new MediaType("multipart", "form-data", contentTypeParams);
MockHttpServletRequestBuilder action = fileUpload(path).file(aFileObject));

mockMvc=MockMvcBuilders.webAppContextSetup(webApplicationContext)
     .addFilter(new DelegatingFilterProxy("springSecurityFilterChain", webApplicationContext), "/*")
     .build()

ResultActions resultPost =mockMvc.perform(action.contentType(mediaType));
assertThat(.....

(我已经简化了一点测试代码(这不是这里的问题。它有效。))

有谁知道如何在测试运行时弄清楚 Multipartresolver 的配置,并在我将所有内容投入生产时启用,而我每次都必须记住评论配置?

4

1 回答 1

4

MockMvc 不与 Servlet 容器一起运行。它使用 MockHttpServletRequest/Response,这意味着您手动设置请求。这包括文件上传。本质上,通过使用 fileUpload(..).file(..) 构建请求,您手动设置了 MockMultipartHttpServletRequest(与 MultipartResolver 在运行时在实际的 Servlet 容器中执行的操作相同)。所以当 DispatcherServlet 处理这个请求时,它意识到这个请求已经被解析为一个多部分请求,并且很高兴继续前进,而不必调用 MultipartResolver。

底线,如果你想测试你的控制器对多部分请求的作用,它应该可以正常工作(参见示例测试:https ://github.com/spring-projects/spring-framework/blob/master/spring-test/ src/test/java/org/springframework/test/web/servlet/samples/standalone/FileUploadControllerTests.java)。如果您想使用 MultipartResolver 来测试实际上传,则需要使用内存服务器编写集成测试。大多数情况下,您可能需要前者,然后使用真实服务器进行一次测试以确保您的解析器在配置中应该没问题。

于 2014-06-25T20:14:22.580 回答