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

Spring Boot使用MockMvc做multipart文件上传测试迭代器为空如何解决

问题原因及修复方案

核心问题点

  • 字段名不匹配:后端解析逻辑判断的是表单字段名为file才会处理,但测试代码构造MockMultipartFile时第一个参数(对应表单字段名)传的是test,名称不匹配直接过滤了文件项。
  • 请求构造错误:MockMvc的multipart()方法会自动完成multipart/form-data格式封装、boundary生成,你手动指定contentType、手动设置content、requestAttr的操作破坏了标准请求体结构,导致ServletFileUpload无法正常解析。
  • 请求流被提前消费:Spring Boot默认自动配置MultipartResolver,会在请求进入业务接口前就读取multipart请求的流,你再用ServletFileUpload读取时流已经为空,自然拿不到文件项。

具体修复步骤

  1. 修正MockMultipartFile的字段名
// 第一个参数改为和后端匹配的字段名file
MockMultipartFile file = new MockMultipartFile("file", "test.pdf", MediaType.APPLICATION_PDF_VALUE, FileUtils.readFileToByteArray(dataFile));
  1. 清理MockMvc冗余配置
mockMvc.perform(multipart("/api/project-others/documents")
        .file(file)
        .with(getAuthentication("AUTH"))
        .param("projectId", "1")
        .param("docId", "1")
    )
    .andExpect(status().isOk())
    .andDo(print());
  1. 关闭Spring默认Multipart处理(仅当你必须用ServletFileUpload手动解析时配置)
    在application配置文件中添加:
spring.servlet.multipart.enabled = false

补充:如果没有特殊兼容需求,更推荐直接用Spring提供的@RequestParam("file") MultipartFile file接收文件,无需手动解析流,测试也更简便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:57:02