测试中未抛出 MaxUploadSizeExceededException

sid*_*ate 6 java junit spring multipartform-data spring-mvc

我有一个简单的 spring 应用程序,带有一个需要多部分文件的控制器。出于测试目的,我将MaxUploadSize大小设置为仅 50 个字节。当我在 tomcat 中部署战争时,我得到了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...
  }
}
Run Code Online (Sandbox Code Playgroud)

测试

@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
  }
}
Run Code Online (Sandbox Code Playgroud)

春季版本:4.1.6

Edu*_*ima 1

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

\n\n

我假设this.mvc是 的一个实例MockMvc。因此弹簧文档:

\n\n
\n

另一种有用的方法是根本不启动服务器,而只测试下面的层,其中 Spring 处理传入的 HTTP 请求并将其交给控制器。这样,几乎可以使用完整的堆栈,并且您的代码将以与处理真实 HTTP 请求完全相同的方式调用,但无需启动服务器的成本。为此,请使用 Spring\xe2\x80\x99s MockMvc 并要求通过在测试用例上使用 @AutoConfigureMockMvc\n 注释来为您注入该 MockMvc。

\n
\n\n

由于没有启动服务器,并且这个异常是Tomcat抛出的,所以永远不会抛出。我只需删除它并使用TestRestTemplate来调用端点即可,效果非常好。这里有一个很好的例子。

\n