将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
答案 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后,项目成功运行。