【问题标题】:'no multipart boundary was found' when testing max upload size using CommonsMultipartResolver使用 CommonsMultipartResolver 测试最大上传大小时“未找到多部分边界”
【发布时间】: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


【解决方案1】:

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

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

  • 使用内部 @Configuration 类,连接作为 Mockito Spy 的多部分解析器。
  • 将解析器自动连接到您的类中
  • 对于 MaxUploadSizeExceededException 测试用例,存根解析器以引发异常,然后执行内容类型为 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));

    }
}    

【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2013-10-08
    • 1970-01-01
    • 2016-02-13
    • 2014-01-03
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多