JUnit测试Controller传递Multipart文件时出现400 Bad Request错误求助
问题分析与解决:400 Bad Request(MissingServletRequestPartException)
你的测试代码存在两个关键问题,直接导致了MissingServletRequestPartException错误:
错误1:用普通参数传递文件,而非Multipart文件
你用.param("file", file.getName())传递的只是文件名字符串,并没有把实际的MockMultipartFile对象作为Multipart请求的part传递给接口,这就导致Controller找不到名为file的请求部分。错误2:POST请求路径错误传入多余参数
MockMvcRequestBuilders.post("/uploadData",file)中的第二个参数file是用来填充路径变量的,但你的Controller接口/uploadData并没有定义路径变量,这属于无效传参,不会起到任何作用。
修正后的测试代码
@Test void testExcelFile() throws Exception { FileInputStream inputFile = new FileInputStream("path of the file"); MockMultipartFile file = new MockMultipartFile("file", "myexcelFile.xlsx", "multipart/form-data", inputFile); Mockito.when(service.upload(file)).thenReturn("received"); // 关键修改:用.file()添加Multipart文件,移除多余的路径参数和.param() RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/uploadData") .file(file) .contentType(MediaType.MULTIPART_FORM_DATA); MvcResult result = mockMvc.perform(requestBuilder) .andExpect(status().isAccepted()) .andReturn(); assertEquals(HttpStatus.ACCEPTED.value(), result.getResponse().getStatus()); }
关键修改说明
- 移除
post方法中多余的file参数,因为接口没有路径变量 - 用
.file(file)替代.param("file", file.getName()),将MockMultipartFile对象作为Multipart请求的part传递,这样Controller就能正确接收到名为file的请求参数 - 简化Mockito的参数匹配(不需要强制类型转换
(MultipartFile) file,直接传file即可)
你的Controller代码本身是正确的,只要修正测试代码的请求构造逻辑,就能解决400错误。
内容的提问来源于stack exchange,提问作者tiya
相关产品推荐
相关产品推荐

