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

Java 17中Mockito.mock()无法正常Mock类的问题求助

解决Java 17升级后Mockito.mock()失效的问题

以下是几个常见原因及对应的解决办法:

  • 模块化访问限制
    Java 9及以上引入的模块系统(JPMS)会默认限制反射访问类内部成员,而Mockito依赖反射实现Mock。如果目标类在模块化项目中:

    • 在module-info.java中为Mockito开放目标包:
      opens com.yourproject.targetpackage to org.mockito;
      
    • 若项目未使用模块化(基于classpath运行),可在测试VM参数中添加--add-opens开放必要包,例如:
      --add-opens java.base/java.lang=ALL-UNNAMED
      
      使用Maven Surefire插件时,可在插件配置中加入该参数:
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
              <argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine>
          </configuration>
      </plugin>
      
  • Mockito版本不兼容
    旧版Mockito对Java 17支持不完善,需升级至兼容版本(推荐Mockito 4.0.0+,优先选择最新5.x系列)。Maven依赖配置示例:

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    
  • 无法Mock最终类/方法
    Mockito默认不支持Mock最终类或方法,若目标类是最终类,需启用inline mock maker:
    在测试资源目录下创建src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker文件,文件内容仅一行:

    mock-maker-inline
    

    配置后Mockito可通过inline方式Mock最终类、方法及静态方法。

  • 反射权限受限
    Java 17收紧了反射访问权限,若测试涉及JDK内部类或敏感API,需在VM参数中添加额外权限配置,例如:

    --add-accessibility java.base/java.lang.reflect=ALL-UNNAMED
    

内容的提问来源于stack exchange,提问作者DilliBabu S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:57:11