我想在我的单元测试中使用PowerMockerRule
,这样我就可以在使用Spring的JUnit Runner运行它们时使用PowerMockito。然而,当我将规则添加到我的测试中时,我得到java.lang.VerifyError
。
java.lang.VerifyError: Expecting a stackmap frame at branch target 47
Exception Details:
Location:
com/sample/package/MyClass.<init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V @25: if_icmpge
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 2a2b 2c01 c000 32b7 0050 2d3a 0419 04be
0x0000010: 3605 0336 0615 0615 05a2 0016 1904 1506
0x0000020: 323a 072a 1907 b600 4984 0601 a7ff e9b1
0x0000030:
到目前为止,我所做的是将javassist依赖项更新为3.20.0-GA,根据我最初的搜索,这通常是问题所在。然而,这仍然不能解决我的问题。还有其他想法吗?
首先谈谈问题的根本原因。JVM验证用户类,以确保类是"安全的",并且不会违反某些规则。现在热点中有2个验证器:ClassVerifier (SplitVerifier)和旧的验证器。新的验证器(SplitVerifier)在java 6中被添加,并且是可选的。这个新的验证器需要在类文件(StackMapTable属性)中提供更多信息。这个属性是由编译器添加的,它跟踪局部变量的类型。
问题是一些工具库可以修改你的代码而不更新StackMapTable(因为bug或库是旧的,不知道这个属性)
如何解决(选择一个):
- 禁用验证
-Xverify:none
- 更新选择另一个仪器库
- 从已修改的类中排除
- 将类主版本降级到50 (java 6)及以下(在这种情况下将使用旧的验证器)
也许你可以检查一下这个问题。在我的情况下,换到最新的版本。现在我的版本是2.0.7
<properties>
<powermock.version>2.0.7</powermock.version>
</properties>