java – 从分支的内部调用坏方法

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

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
UPDATE

有更新的java7版本可以解决这个问题。正如写给Powermock / Javassist creates illegal constructors for JDK 1.7.0u65 and 1.8.0u11 with -target 7 #525的回复

upgrading from java 7u71 to 7u75 fixed the problem

根本原因

经过调查,我听到了所有来自互联网的帮助的所有工具和语言,建立在JDK上。

原来是由新的验证者检查的新的java字节码标准的原因。但是不幸的是,有时候,powassock会询问javassist来产生一个不再被这个新的闪亮非常好的字节码所替代的变化。

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

作为JRebel blog的解决方法,他们建议在启动JVM时使用-noverify标志
然而,我发现从Java 7 Bytecode Verifier: Huge backward step for the JVM博客替代工作在java7的工作方法:-XX:-UseSplitVerifier

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

<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 creates illegal constructors for JDK 1.7.0u65 and 1.8.0u11 with -target 7.
Powermock / Javassist creates illegal constructors for JDK 1.7.0u65 and 1.8.0u11 with -target 7 #525

http://stackoverflow.com/questions/25428317/bad-init-method-call-from-inside-of-a-branch

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 从分支的内部调用坏方法