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
我遇到了同样的问题,幸运的是我能够解决它。
\n\n我假设this.mvc是 的一个实例MockMvc。因此弹簧文档:
\n\n\n另一种有用的方法是根本不启动服务器,而只测试下面的层,其中 Spring 处理传入的 HTTP 请求并将其交给控制器。这样,几乎可以使用完整的堆栈,并且您的代码将以与处理真实 HTTP 请求完全相同的方式调用,但无需启动服务器的成本。为此,请使用 Spring\xe2\x80\x99s MockMvc 并要求通过在测试用例上使用 @AutoConfigureMockMvc\n 注释来为您注入该 MockMvc。
\n
由于没有启动服务器,并且这个异常是Tomcat抛出的,所以永远不会抛出。我只需删除它并使用TestRestTemplate来调用端点即可,效果非常好。这里有一个很好的例子。
\n| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |