如何为返回XSSFWorkbook的方法编写JUnit单元测试
正确测试createWorkbook方法的JUnit方案
不要mock XSSFWorkbook——它是你方法的核心输出,mock空对象完全无法验证业务逻辑。正确的思路是:构造真实测试数据,调用方法后拆解验证workbook的内部内容,而非对比对象引用是否相等。
具体步骤
准备测试数据与预期规则
- 构造符合业务格式的
List<Object>测试列表,比如模拟几行业务对象数据 - 明确预期的表头内容(比如
["ID", "姓名", "年龄"])
- 构造符合业务格式的
调用目标方法获取实际workbook
直接调用createWorkbook(testData)得到真实的XSSFWorkbook实例,不需要任何mock。逐段验证workbook内容
拆解验证核心部分,确保和预期一致:- 验证sheet数量:
assertEquals(1, actualWorkbook.getNumberOfSheets()); - 验证表头行:
XSSFSheet sheet = actualWorkbook.getSheetAt(0); XSSFRow headerRow = sheet.getRow(0); assertEquals("ID", headerRow.getCell(0).getStringCellValue()); assertEquals("姓名", headerRow.getCell(1).getStringCellValue()); // 依次验证所有表头单元格 - 验证数据行数量:
// 表头是第0行,数据行从第1行开始,所以总数据行数等于测试数据的大小 assertEquals(testData.size(), sheet.getLastRowNum()); - 逐行验证数据内容:
for (int i = 0; i < testData.size(); i++) { BusinessObj obj = (BusinessObj) testData.get(i); XSSFRow dataRow = sheet.getRow(i + 1); // 根据字段类型选择对应的取值方法 assertEquals(obj.getId(), (int) dataRow.getCell(0).getNumericCellValue()); assertEquals(obj.getName(), dataRow.getCell(1).getStringCellValue()); // 验证其他字段 }
- 验证sheet数量:
可选:验证文件输出正确性
如果需要确认生成的xlsx文件有效,可以将workbook写入字节数组流,再读取回来二次验证;或者和预先准备的标准xlsx文件对比核心内容(注意POI生成的文件元数据可能有细微差异,优先对比单元格值)。
关键注意事项
- 绝对不要用
assertEquals(预期workbook实例, 实际workbook实例)——POI的对象equals方法通常只对比引用或少量属性,几乎不可能匹配。 - 如果
createWorkbook依赖其他服务(比如从配置获取表头),可以mock这些依赖,但XSSFWorkbook必须是真实实例。
内容的提问来源于stack exchange,提问作者SnazzY808
相关产品推荐
相关产品推荐

