测试中未抛出MaxUploadSizeExceededException

时间:2017-09-07 13:21:20

标签: java spring spring-mvc junit multipartform-data

我有一个简单的弹簧应用程序,其控制器需要多部分文件。出于测试目的,我将MaxUploadSize大小设置为仅50个字节。当我在tomcat中部署war时,我得到了较大文件的预期MaxUploadSizeExceededException,但如果我在单元测试中使用相同的文件,则测试不起作用。

配置

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = {...})
public class MyApplication extends WebMvcConfigurerAdapter {

  @Bean
  public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver commonsMultipartResolver =
        new CommonsMultipartResolver();
    commonsMultipartResolver.setDefaultEncoding("utf-8");
    commonsMultipartResolver.setMaxUploadSize(50);
    return commonsMultipartResolver;
  }
}

@RestController
@RequestMapping("/metadata")
public class MyController {

  @RequestMapping(method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
      produces = MediaType.APPLICATION_JSON_VALUE)
  public String metadata(@RequestParam MultipartFile file)  {
     //some processing...
  }
}

测试

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = MyApplication.class)
public class MyControllerTest {
...
@Test
  public void testDocx() throws Exception {
    byte[] docx = FileUtils.readFileToByteArray(new File(
            "src/test/resources/testdocs/test.docx"));
    MockMultipartFile multipartFile = new MockMultipartFile("file", "test.docx", "", docx);
    this.mvc.perform(fileUpload("/metadata").file(multipartFile))
        .andDo(print()).andExpect(status().is5xxServerError()); 
   //doesn't work, returns 200
  }
}

Spring版本:4.1.6

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,幸运的是我能够解决它。

我假设this.mvcMockMvc的实例。相应的spring文档:

另一种有用的方法是根本不启动服务器,而是进行测试 只有它下面的一层,Spring处理传入的HTTP 请求并将其交给您的控制器。这样,几乎 使用完整堆栈,您的代码将以完全相同的方式调用 好像正在处理真实的HTTP请求一样,但没有成本 启动服务器。为此,请使用Spring的MockMvc并要求 通过使用@AutoConfigureMockMvc为您注入 测试用例上的注释。

由于没有启动服务器,并且Tomcat引发了此异常,因此永远不会引发该异常。我只需要删除它,并使用TestRestTemplate来调用端点,就可以像魅力一样工作。有一个很好的例子here