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

Spring MVC测试:如何将MvcRequester的Excel响应存入变量?

解决方案

你的控制器是直接通过HttpServletResponse的输出流写入Excel内容,并没有返回标准的文件对象,所以测试代码里不能直接用MultipartFile、File这类类型接收响应。正确的做法是获取响应的字节数组,再根据需求转成输入流或写入文件。

方法一:用MvcRequester直接返回字节数组

// 获取响应的字节数组
byte[] excelContent = MvcRequester.on(mockMvc)
                                  .to("/api/reports/complaints/full")                                        
                                  .get()
                                  .doExpect(status().isOk())
                                  // 验证响应的Content-Type是否符合Excel格式
                                  .doExpect(content().contentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
                                  .returnAs(byte[].class);

// 转成InputStream用于后续处理
InputStream excelStream = new ByteArrayInputStream(excelContent);

// 或者写入本地文件保存
Files.write(Paths.get("local_test_report.xlsx"), excelContent);

方法二:借助MockHttpServletResponse获取内容

如果需要更底层的响应对象,也可以从ResultActions中拿到MockHttpServletResponse:

ResultActions resultActions = MvcRequester.on(mockMvc)
                                          .to("/api/reports/complaints/full")                                        
                                          .get()
                                          .doExpect(status().isOk());

MockHttpServletResponse response = resultActions.andReturn().getResponse();
byte[] excelContent = response.getContentAsByteArray();

// 后续处理同上,转流或写文件

为什么之前的类型不生效

  • MultipartFile是Spring用于处理上传文件的类型,不适用于接收下载响应;
  • File需要对应本地已存在的文件路径,而接口响应是内存中的数据流,无法直接映射;
  • InputStream/FileInputStream需要绑定实际的输入源,MvcRequester没有默认的转换器将响应直接转成这类流对象,而字节数组是通用的中间载体。

如果需要验证Excel的具体内容,可以用Apache POI等库读取字节数组中的Excel数据:

// 示例:用POI读取Excel内容
XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(excelContent));
XSSFSheet sheet = workbook.getSheetAt(0);
// 读取单元格数据做断言验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:42:36