从分支内部调用错误的<init>方法

Lau*_*uri 22 java powermock maven javassist

将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
Run Code Online (Sandbox Code Playgroud)

Lau*_*uri 48

UPDATE

有更新的java7版本可以解决此问题.正如回复Powermock/Javassist所写,为JDK 1.7.0u65和1.8.0u11创建非法构造函数,其中-target为7#525

从java 7u71升级到7u75解决了这个问题

根本原因

经过调查,我听到了来自互联网上所有基于JDK的工具和语言的帮助.

原因是新的验证程序检查了新的java字节码标准.但不幸的是,javassist有时会被powermock要求产生字节码的变化,这些变化不再被这个新的闪亮的非常有效.

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

作为一种变通方法JRebel的博客,他们建议使用-noverify在启动JVM标志,但是我发现从Java 7的字节码校验:JVM的巨大倒退博客中可选的解决方法是在java7工作:-XX:-UseSplitVerifier

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

<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>
Run Code Online (Sandbox Code Playgroud)

我想在java8上可以使用类似的方法用-noverify键调用测试,但还没有机会确认.

其他相关资源值得关注

Powermock/Javassist是创建JDK 1.7.0u65和1.8.0u11违法建设者与-target 7 Powermock/Javassist是用-target 7#525创造了JDK 1.7.0u65和非法建设者1.8.0u11


小智 6

与java8有同样的问题,并使用-noverify解决它

  • 我在JDK8v20上遇到过这个问题.升级到JDK8v45解决了这个问题. (6认同)

Che*_*age 5

我有同样的问题,因为项目建立在jdk1.8.0_51上,我的机器上有jdk1.8.0_11. 升级到机器中的jdk1.8.0_51后,项目成功运行.