MockMultipartFile 是 Spring Test 提供的模拟 MultipartFile 的测试类,用于绕过 IO 在 Controller 层测试文件上传;需显式指定 UTF-8 编码、正确 contentType(如 “application/xml;charset=UTF-8″)及 .xml 后缀文件名,并用 fileUpload() 而非 post() 发送请求。
MockMultipartFile 是什么,为什么不能直接 new
MockMultipartFile 是 Spring Test 模块提供的一个测试用类,专为模拟 org.springframework.web.multipart.MultipartFile 设计。它不是真实文件上传的替代品,而是绕过文件系统 IO、让 Controller 层能正常接收并解析 multipart 请求的“假文件”。直接 new MultipartFile 接口会报错,因为它是接口,且 Spring 的文件解析逻辑强依赖具体实现的 getInputStream()、getOriginalFilename() 等行为。
构造 MockMultipartFile 上传 XML 文件的正确姿势
关键点在于:内容字节数组必须是合法 XML 字符串编码后的结果,且 contentType 要匹配(比如 application/xml 或 text/xml),否则某些 XML 解析器(如 @RequestBody @XmlRootElement)可能拒绝处理。
- 文件名必须带
.xml后缀,否则部分基于后缀路由的拦截器或日志可能出问题 -
bytes参数要用String.getBytes(StandardCharsets.UTF_8)显式指定编码,避免平台默认编码不一致导致解析失败 -
contentType推荐写成"application/xml;charset=UTF-8",和实际生产请求头对齐
String xmlContent = "123Alice";
byte[] xmlBytes = xmlContent.getBytes(StandardCharsets.UTF_8);
MockMultipartFile file = new MockMultipartFile(
"file", // 表单字段名,要和 @RequestParam("file") 一致
"test.xml", // 原始文件名,必须含 .xml
"application/xml;charset=UTF-8", // content-type
xmlBytes // 字节内容
);
在 MockMvc 测试中发送 XML 文件请求
注意:不能用 contentType(MediaType.MULTIPART_FORM_DATA) 简单设置,必须用 fileUpload() 方法触发 multipart 处理链;否则 Spring 不会调用 MultipartResolver,Controller 收到的仍是 null。