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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:36:03