如何使用mockito-inline模拟抛出IOException的XSSFWorkbook构造方法
错误原因
你代码报错的核心问题是when(new XSSFWorkbook()).thenThrow(IOException.class)是非法的Mockito桩代码写法:when()方法只接收Mock对象的方法调用作为入参,无法直接对构造方法调用做桩定义。构造方法模拟需要通过MockedConstruction的回调逻辑实现。
正确实现代码
你业务代码调用的是带参数的XSSFWorkbook构造方法,直接在MockedConstruction的初始化回调中抛出需要的IOException即可:
try (MockedConstruction<XSSFWorkbook> mocked = Mockito.mockConstruction(XSSFWorkbook.class, (mock, constructionContext) -> { // 所有XSSFWorkbook对象构造时直接抛出指定IOException throw new IOException("模拟构造XSSFWorkbook失败"); })) { doReturn("2021-09-30").when(stpConfigurationMock).getStartDate(); // 执行业务代码,此时内部new XSSFWorkbook会直接触发异常进入catch分支 Workbook workBook = fileService.generateReport(listItem, startDate, endDate); // 此处可添加断言验证异常分支逻辑正确性,比如返回值、日志输出等 }
如果需要仅针对特定入参的构造方法抛异常,可以加参数匹配逻辑:
try (MockedConstruction<XSSFWorkbook> mocked = Mockito.mockConstruction(XSSFWorkbook.class, (mock, constructionContext) -> { // 匹配业务代码中传入templateWithoutEvents参数的构造调用 if (constructionContext.arguments().size() == 1 && constructionContext.arguments().get(0).equals(templateWithoutEvents)) { throw new IOException("模拟构造XSSFWorkbook失败"); } })) { // 其他业务逻辑不变 }
注意事项
必须确保测试依赖引入的是mockito-inline而非默认的mockito-core,否则不支持构造方法模拟能力,参考Maven依赖配置:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>与你项目使用的Mockito版本一致</version> <scope>test</scope> </dependency>
内容的提问来源于stack exchange,提问作者Laur Alex
相关产品推荐
相关产品推荐

