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

时间:2014-08-21 13:59:32

标签: java maven powermock javassist

将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

3 个答案:

答案 0 :(得分:48)

<强>更新

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

所写
  

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

<强>根本原因

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

原因是新的验证程序检查了新的java字节码标准。但遗憾的是, javassist 有时会被 powermock 要求对字节码进行更改,这些更改不会被这个新的闪亮的非常容易接受。

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

作为JRebel blog中的解决方法,他们建议在启动JVM时使用 -noverify 标志 但是我从Java 7 Bytecode Verifier: Huge backward step for the 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>

我想在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

答案 1 :(得分:5)

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

解决它

答案 2 :(得分:5)

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