gpt4 book ai didi

java - 使用 CommonsMultipartResolver 测试最大上传大小时“未找到多部分边界”

转载 作者:太空宇宙 更新时间:2023-11-04 07:21:12 26 4
gpt4 key购买 nike

在实际应用程序中,我使用org.springframework.web.multipart.commons.CommonsMultipartResolver,其中定义maxUploadSize参数。所以我想使用 spring mvc 测试来测试捕获 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();
}

在测试环境中(基于 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 header 中设置唯一的边界,并用此边界分隔正文中的各个部分,但 spring 模拟测试在发送模拟多部分请求时不会设置边界。

所以我找到了org.springframework.http.converter.FormHttpMessageConverter,创建了org.springframework.test.web.servlet.request.RequestPostProcessor,其中将正文和Content-Type header 转换为正确(带边界)并将后处理器添加到请求构建器 - 测试通过了!

也许有人知道更好或更简单的方法来向模拟请求的 Content-Type header 和正文添加边界?!

附注
如果没有更好的方法 - 我可以在此处附加我的 RequestPostProcessor
使用的版本:

  • spring-test-3.2.0
  • commons-fileupload-1.2.2

最佳答案

我找到了一个很好的干净方法来测试 MaxUploadSizeExceededException

它涉及使用 Mockito 监视 MultipartResolver 以强制抛出异常。

  • 使用内部 @Configuration 类,连接作为 Mockito Spy 的多部分解析器。
  • 将解析器 Autowiring 到您的类中
  • 对于 MaxUploadSizeExceededException 测试用例, stub 解析器以引发异常,然后执行内容类型为 MediaType.MULTIPART_FORM_DATA 的发布

这是代码。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {SpringMVCConfiguration.class, UploadTest.TestConfiguration.class})
@SuppressWarnings("unchecked")
public final class UploadTest {

public static final String MERCHANT_AUTH = "MERCHANT_AUTH";
public static final String USER = "user";

@Configuration
public static class TestConfiguration {
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSize(500 * 1028);
return Mockito.spy(resolver);
}
}

@Autowired
private WebApplicationContext m_webApplicationContext;

@Autowired
private CommonsMultipartResolver m_multipartResolver;

private MockMvc m_mockMvc;

@Before
public void setUp() throws Exception {
m_mockMvc = MockMvcBuilders.webAppContextSetup(m_webApplicationContext).build();
}

@Test
public void testName() throws Exception {
Mockito.reset(m_multipartResolver);
}

@Test
public void testUpload_FileTooLarge() throws Exception {

/*
Force multipart resolver to throw file too large exception
*/
doThrow(new MaxUploadSizeExceededException(100)).when(m_multipartResolver).resolveMultipart(
any(HttpServletRequest.class));

/*
Do a multipart post. Cannot use fileUpload as that skips calling the MultipartResolver
*/
m_mockMvc.perform(post("/upload/")
.contentType(MediaType.MULTIPART_FORM_DATA)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isRequestEntityTooLarge())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON));

}
}

关于java - 使用 CommonsMultipartResolver 测试最大上传大小时“未找到多部分边界”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19293842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com