从分支内部调用错误的<初始化>方法

2022-09-02 00:16:40

将JDK升级到java7u65后,使用MockitoPowerMock的几个单元测试开始失败,原因如下:

15:15:23,807 INFO  - Tests in error: 
15:15:23,810 INFO  -   initializationError(com.your.ClassHere): Bad <init> method call from inside of a branch

答案 1

更新

有较新的 java7 版本可以解决此问题。正如在回复Powermock / Javassist时所写的,为JDK 1.7.0u65和1.8.0u11创建了非法构造函数,目标为7 #525

从java 7u71升级到7u75修复了问题

根因

经过调查,我听到来自互联网上的所有基于JDK的工具和语言的呼声。

事实证明,原因是新的java字节码标准被新的验证器检查。但不幸的是,javassist有时会被powermock要求对字节码进行更改,而这些更改不再被这个新的闪亮的非常精细器所接受。

解决方法(对于那些不能使用较新的java的人)

作为JRebel博客中的解决方法,他们建议在启动JVM时使用-noverify标志 但是我从Java 7字节码验证器中发现:JVM博客文章在java7上工作的替代解决方法的巨大后退步骤:-XX:-UseSplitVerifier

由于我的测试在一些无法访问的服务器中运行,并作为maven构建的一部分执行,我需要找到一种方法来传递该参数以及我的项目文件。我发现的第一个可行的解决方案是将此参数添加到pom中surefire插件的配置中.xml如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <argLine>-XX:-UseSplitVerifier</argLine>
            </configuration>
        </plugin>
        <plugin>
    </plugins>
</build>

我想在java8上,人们可以使用类似的方法用-noverify键调用测试,但没有机会确认这一点。

其他需要关注的相关资源

Powermock / Javassist 为 JDK 1.7.0u65 和 1.8.0u11 创建非法构造函数,目标为 -target 7。Powermock / Javassist 为 JDK 1.7.0u65 和 1.8.0u11 创建非法构造函数,目标为 7 #525


答案 2

在java8上遇到同样的问题,并使用-noverify解决它


推荐