gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:51:48 25 4
gpt4 key购买 nike

我想在单元测试中使用 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 个 validator :ClassVerifier (SplitVerifier) 和旧 validator 。 java 6 中添加了新的 validator (SplitVerifier),并且是可选的。这个新的 validator 需要类文件中的更多信息(StackMapTable 属性)。该属性由编译器添加,它跟踪局部变量的类型。

问题是某些检测库可以修改您的代码但不会更新 StackMapTable(因为错误或库太旧并且不知道此属性)

如何解决(选择一项):

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

关于java - 在 Java 8 中运行 PowerMock 时如何修复VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38838128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com