在Spring中使用CommonsMultipartResolver,在test中使用config



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

多部分解析器的配置很简单:

<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的配置,并在我将所有内容投入生产时启用,而不需要每次都记住注释配置?

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参与的情况下测试实际的上传,则需要使用内存服务器编写集成测试。在大多数情况下,前者是您需要的,然后使用真实服务器进行一次测试,以确保您的解析器在配置中应该是正确的。

相关内容

  • 没有找到相关文章

最新更新