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
相关产品推荐
相关产品推荐

