【发布时间】:2013-10-10 10:54:54
【问题描述】:
在实际应用中,我使用org.springframework.web.multipart.commons.CommonsMultipartResolver 定义 maxUploadSize 参数。所以我想用spring mvc test来测试捕捉MaxUploadSizeExceededException。
为此,我在 Java 中添加 org.springframework.web.multipart.support.MultipartFilter:
@Autowired
private WebApplicationContext wac;
@Autowired
private MultipartFilter multipartFilter;
private MockMvc mockMvc;
@Before
public void init() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac)
.addFilter(multipartFilter).build();
}
在测试conext中(基于xml的配置):
<bean id="multipartFilter" class="org.springframework.web.multipart.support.MultipartFilter">
<property name="multipartResolverBeanName" value="MyMultipartResolverBeanName" />
</bean>
MyMultipartResolverBeanName bean 在现实生活中定义,使用 maven-surefire-plugin 添加到测试上下文中。
我的测试就像教程中的一样:
@Test(expected = MaxUploadSizeExceededException.class)
public void testCertSizeInvalid() throws Exception {
mockMvc.perform(fileUpload(SUBMIT_URL)
.file(new MockMultipartFile("fileName", new byte[MAX_UPLOAD_SIZE + 10]))
);
}
运行时我得到原因:org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界来自org.apache.commons.fileupload.FileUploadBase
据我了解,在现实生活中,浏览器在 Content-Type 标头中设置了唯一边界,并使用此边界分隔正文中的部分,但 spring 模拟测试在发送模拟多部分请求时不会设置边界。
所以我找到了org.springframework.http.converter.FormHttpMessageConverter,创建了org.springframework.test.web.servlet.request.RequestPostProcessor,其中将正文和Content-Type标头转换为更正(带边界)并将后处理器添加到请求生成器-测试通过!。。 p>
也许有人知道更好或更简单的方法来为 Content-Type 标头和模拟请求正文添加边界?!
PS
如果没有更好的方法 - 我可以在此处附上我的 RequestPostProcessor
使用的版本:
- spring-test-3.2.0
- commons-fileupload-1.2.2
【问题讨论】:
-
嗨,你能把你的 RequestPostProcessor 放在这里吗?非常有帮助,非常感谢!
-
@user2628641 不幸的是我失去了这个旧项目(
标签: java spring unit-testing file-upload