如何在 Mockito 中模拟构造函数抛出异常(无需 PowerMock)

梦静酱_7164

梦静酱_7164

2026-07-25

655人浏览

原创

如何在 Mockito 中模拟构造函数抛出异常(无需 PowerMock)

本文介绍在不使用 PowerMock 的前提下,利用 Mockito 5.2+ 的 MockedConstruction 正确模拟构造函数抛出异常的方法,并推荐更符合测试最佳实践的重构方案——通过可注入工厂替代直接构造调用。

本文介绍在不使用 powermock 的前提下,利用 mockito 5.2+ 的 `mockedconstruction` 正确模拟构造函数抛出异常的方法,并推荐更符合测试最佳实践的重构方案——通过可注入工厂替代直接构造调用。

Mockito 自 3.4.0 起引入了 MockedConstruction(需配合 mockito-inline),它允许在对象实例化时进行拦截和定制。但需明确一点:MockedConstruction 本身不支持“在 when(...).thenThrow() 风格中动态配置构造行为”——你无法像 mock 方法那样对构造过程做 when(mocked.constructed()).thenThrow(...),因为 constructed() 返回的是已创建实例的列表(即构造已完成),而非一个可 stub 的行为代理。

因此,你最初尝试的 when(??).thenThrow(ex) 中的 ?? 实际上不存在合法的 stub 目标;构造行为必须在 MockInitializer 或 Answer 中提前声明,而非事后配置。

✅ 正确用法(推荐):使用 MockedConstruction + MockInitializer(简洁 Lambda 版)

@Test
void exceptionAtConstruction() {
    RuntimeException ex = new RuntimeException("simulated construction failure");

    try (MockedConstruction<someclass> ignored = 
         Mockito.mockConstruction(SomeClass.class,
             (mock, context) -> { throw ex; })) {

        assertThrows(RuntimeException.class, () -> new SomeClass());
    }
}</someclass>

⚠️ 注意事项:

  • MockedConstruction 是 try-with-resources 资源,必须在 try 块内执行 new SomeClass(),否则拦截不生效;
  • 抛出的异常会作为 RuntimeException 的直接原因(cause),而非原始异常本身(因 Mockito 将其包装为 MockConstructionException)。若需严格匹配异常类型与消息,建议使用 assertThrows 的返回值做进一步断言:
    Throwable thrown = assertThrows(RuntimeException.class, () -> new SomeClass());
    assertEquals("simulated construction failure", thrown.getMessage());

? 更优解:重构代码,避免构造函数测试困境(强烈推荐)

小易AI
小易AI

小易AI是一款AI办公效率工具,易企秀推出的AI办公工具。

下载

Mockito 官方明确建议:“Don’t mock a type you don’t own”(来源)。直接 mock 第三方或不可控类的构造函数,本质是测试脆弱性高、违反封装的设计。

✅ 推荐做法:引入可替换的工厂抽象

class YourService {
    // 可测试性入口:默认使用真实构造器,测试时可替换
    private final Supplier<someclass> someClassFactory;

    // 生产构造器
    public YourService() {
        this(SomeClass::new);
    }

    // 测试专用构造器
    @VisibleForTesting
    YourService(Supplier<someclass> factory) {
        this.someClassFactory = factory;
    }

    public void doSomething() {
        SomeClass instance = someClassFactory.get(); // ← 构造行为被解耦
        // ... use instance
    }
}</someclass></someclass>

对应测试(零依赖 Mockito):

@Test
void doSomething_throwsOnConstruction() {
    Supplier<someclass> failingFactory = () -> {
        throw new RuntimeException("boom");
    };

    YourService service = new YourService(failingFactory);

    assertThatThrownBy(service::doSomething)
        .isInstanceOf(RuntimeException.class)
        .hasMessage("boom");
}</someclass>

? 总结:

  • MockedConstruction 是可行的技术方案,适用于临时绕过构造异常场景,但应谨慎使用;
  • 真正可持续的解决方案是面向测试重构:将构造逻辑提取为策略(Supplier、Function<...> 或接口),实现关注点分离;
  • 这不仅使构造异常测试变得简单直接,还提升了代码的可维护性、可扩展性与设计清晰度。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

2023.10.13

4610

8

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2023.10.23

3001

10

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

2025.10.24

1086

26

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

20

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习