我有一个简单的弹簧应用程序,其控制器需要多部分文件。出于测试目的,我将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
答案 0 :(得分:0)
我遇到了同样的问题,幸运的是我能够解决它。
我假设this.mvc
是MockMvc
的实例。相应的spring文档:
另一种有用的方法是根本不启动服务器,而是进行测试 只有它下面的一层,Spring处理传入的HTTP 请求并将其交给您的控制器。这样,几乎 使用完整堆栈,您的代码将以完全相同的方式调用 好像正在处理真实的HTTP请求一样,但没有成本 启动服务器。为此,请使用Spring的MockMvc并要求 通过使用@AutoConfigureMockMvc为您注入 测试用例上的注释。
由于没有启动服务器,并且Tomcat引发了此异常,因此永远不会引发该异常。我只需要删除它,并使用TestRestTemplate来调用端点,就可以像魅力一样工作。有一个很好的例子here。