在Java 8中运行PowerMock时如何修复VerifyError

Psy*_*nch 0 java powermock java-8

我想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:
Run Code Online (Sandbox Code Playgroud)

到目前为止我所做的一直是根据我的初始搜索将我的javassist依赖关系更新为3.20.0-GA,这通常是问题所在.但是,它仍然无法解决我的问题.还有其他想法吗?

小智 5

首先是关于你的问题的根本原因.JVM验证用户类以确保该类是"安全的"并且它不会违反某些规则.现在在热点中有2个验证器:ClassVerifier(SplitVerifier)和旧验证器.新的验证程序(SplitVerifier)在java 6中添加并且是可选的.这个新的验证器在类文件(StackMapTable属性)中需要更多信息.此属性由编译器添加,它跟踪局部变量的类型.

问题是一些检测库可以修改你的代码并且不更新StackMapTable(因为bug或库很旧而且不知道这个属性)

如何解决(选择一个):

  1. 禁用验证 -Xverify:none
  2. 更新\选择另一个检测库
  3. 排除已修改的类
  4. 将类主要版本降级到50(java 6)及以下(在这种情况下将使用旧验证程序)