我有一个集成测试,可以在我的控制器上发出请求(上传文件)。 测试无需设置任何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的配置,并且当我将所有产品投入生产时启用,我必须记住每次评论配置?
答案 0 :(得分:3)
MockMvc不能与Servlet容器一起运行。它使用MockHttpServletRequest / Response,这意味着您手动设置请求。这包括文件上传。本质上,通过使用fileUpload(..)。file(..)构建请求,您手动设置MockMultipartHttpServletRequest(MultipartResolver在实际Servlet容器中将在运行时执行相同的操作)。因此,当DispatcherServlet处理此请求时,它会意识到请求已被解析为多部分请求,并且很高兴继续而不必调用MultipartResolver。
最重要的是,如果你想测试控制器对多部分请求的作用,它应该可以正常工作(参见示例test:https://github.com/spring-projects/spring-framework/blob/master/spring-test/src/test/java/org/springframework/test/web/servlet/samples/standalone/FileUploadControllerTests.java)。如果要测试涉及MultipartResolver的实际上载,则需要编写与内存服务器的集成测试。机会是前者是大多数情况下你需要的,然后用真实服务器进行一次测试以确保你的解析器在配置中应该没问题。