Jacoco、JMockit 和 JDK14 的 Maven surefire 插件问题

标签 maven jacoco jmockit java-14

我尝试将我的项目从 JDK 11 升级到 JDK 14,但是在将 java 版本设置为 14 后运行测试失败。当我将 jacoco 与 JMockit 结合使用时,我按如下方式配置了我的构建(编辑:JaCoCo 版本为 0.8.3/0.8.5,JMockit 版本 1.49):

    <build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${version.jacoco}</version>
            <executions>
                <execution>
                    <id>coverage-initialize</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>coverage-report</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${version.surefire-plugin}</version>
            <configuration>
                <argLine>
                    @{argLine} -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${version.jmockit}/jmockit-${version.jmockit}.jar
                </argLine>
            </configuration>
        </plugin>
...
如果我在 Java 版本设置为 11 的情况下运行 maven,一切正常,但是当我将 Java 版本设置为 14 时,surefire 插件会抛出此错误:
[ERROR] java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
[ERROR]         at org.jacoco.agent.rt.internal_1f1cc91.CoverageTransformer.transform(CoverageTransformer.java:93)
[ERROR] sun.util.locale.provider.LocaleDataMetaInfo: Unable to load sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo
[ERROR]         at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
[ERROR]         at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
[ERROR]         at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)
[ERROR]         at java.base/java.lang.ClassLoader.defineClass2(Native Method)
[ERROR]         at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1109)
我在surefire argline的配置中将问题追溯到@{argLine}。如果我删除它,构建运行得很好。不幸的是,这个配置是 JaCoCo 需要的。没有它,它不会产生任何报告。
有什么建议?
附录:刚刚发现,使用 JDK14 运行时测试失败。它不依赖于 pom.xml 中设置的编译版本。

最佳答案

根据 JaCoCo 变更日志 ( https://www.jacoco.org/jacoco/trunk/doc/changes.html ) 在 JaCoCo 0.8.5 版中添加了对 Java 14 类文件的支持,但是截至今天最新的 JMockit 1.49 版仍不完全支持 Java 11 字节码 - 请参阅 JMockit https://github.com/jmockit/jmockit1/issues/615#issuecomment-501009439 中的公开票证:

JMockit should be fixed to properly handle condy (https://openjdk.java.net/jeps/309).

关于Jacoco、JMockit 和 JDK14 的 Maven surefire 插件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63861026/

相关文章:

gradle - SonarQube和Jacoco之间的线路覆盖范围不同

gradle - 如何使用Jacoco仅在Gradle项目中获取特定类的代码覆盖率

jmockit - JUnit 5 测试因使用 JMockit 依赖项而失败。如何测试引用静态方法的方法

eclipse - 启动 gwt 时出现编译器错误 :compile with gwt-maven-plugin

java - 如何从原型(prototype)创建 Maven 项目?

android - 升级到 AGP 4.2.0,无法生成 Jacoco 代码覆盖率报告

java - 使用 jMockit 进行行为测试以检查函数是否被调用

java - 将值添加到 Java ENUM 以进行测试

java - NoSuchMethodError:Lcom/google/firebase/FirebaseApp 类中没有虚方法 zzEq()Z;

java - Google Drive SDK 快速入门文档中的损坏示例