从分支内部调用错误的<初始化>方法
将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
将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
更新
有较新的 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
在java8上遇到同样的问题,并使用-noverify解决它