You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()); 
}

关键修改说明

  1. 移除post方法中多余的file参数,因为接口没有路径变量
  2. 用.file(file)替代.param("file", file.getName()),将MockMultipartFile对象作为Multipart请求的part传递,这样Controller就能正确接收到名为file的请求参数
  3. 简化Mockito的参数匹配(不需要强制类型转换(MultipartFile) file,直接传file即可)

你的Controller代码本身是正确的,只要修正测试代码的请求构造逻辑,就能解决400错误。

内容的提问来源于stack exchange,提问作者tiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:35:52