PowerMock的java.lang.VerifyError: Inconsistent stackmap frames at branch target异常分析

本文主要是介绍PowerMock的java.lang.VerifyError: Inconsistent stackmap frames at branch target异常分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用PowerMock进行单元测试时,要测试如下构造函数:

public FileSourcePc(Resource resource){...
}

执行测试的过程中,每次运行到这里就会抛出如下异常:

java.lang.VerifyError: Inconsistent stackmap frames at branch target 126
Exception Details:Location:com/mydomain/commonlibrary/file/FileSourcePc.<init>(Lcom/mydomain/commonlibrary/model/Resource;)V @126: aload_2Reason:Type uninitializedThis (current frame, locals[2]) is not assignable to 'com/mydomain/commonlibrary/file/FileSourcePc' (stack map, locals[2])Current Frame:bci: @112flags: { flagThisUninit }locals: { uninitializedThis, 'com/mydomain/commonlibrary/model/Resource', uninitializedThis, 'java/lang/String', 'java/lang/String', 'java/lang/String', integer, 'java/lang/String', 'java/lang/String', 'java/lang/String', top, 'java/lang/Object' }stack: { 'java/lang/Object', 'java/lang/Object' }Stackmap Frame:bci: @126flags: { flagThisUninit }locals: { uninitializedThis, 'com/mydomain/commonlibrary/model/Resource', 'com/mydomain/commonlibrary/file/FileSourcePc', 'java/lang/String', 'java/lang/String', 'java/lang/String', integer, 'java/lang/String', 'java/lang/String', 'java/lang/String' }stack: { }Bytecode:0000000: 2a2b b900 1701 0012 192b b900 1c01 00100000010: 152b b900 1f01 002b b900 2201 0012 243a0000020: 093a 083a 0736 063a 053a 044e 4d12 26b80000030: 002c 1007 bd00 2e59 032d 5359 0419 04530000040: 5905 1905 5359 06bb 0030 5915 06b7 00330000050: 5359 0719 0753 5908 1908 5359 1006 19090000060: 5312 35b8 0039 b800 3f3a 0b19 0bb2 00430000070: a500 0e2a 01c0 0045 b700 49a7 0016 2c2d0000080: 1904 1905 1506 1907 1908 1909 b700 4b010000090: 572a b700 4fb1                         Stackmap Table:full_frame(@126,{UninitializedThis,Object[#15],Object[#16],Object[#18],Object[#18],Object[#18],Integer,Object[#18],Object[#18],Object[#18]},{})full_frame(@145,{UninitializedThis,Object[#15]},{})at java.lang.Class.getDeclaredMethods0(Native Method)at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)at java.lang.Class.getDeclaredMethod(Class.java:2002)at org.mockito.cglib.proxy.Enhancer.getCallbacksSetter(Enhancer.java:631)at org.mockito.cglib.proxy.Enhancer.isEnhanced(Enhancer.java:605)at org.powermock.api.extension.proxyframework.ProxyFrameworkImpl.isProxy(ProxyFrameworkImpl.java:50)at org.powermock.reflect.internal.WhiteboxImpl.getUnmockedType(WhiteboxImpl.java:1661)at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.createNewSubstituteMock(DefaultConstructorExpectationSetup.java:92)at org.powermock.api.mockito.internal.expectation.DefaultConstructorExpectationSetup.withArguments(DefaultConstructorExpectationSetup.java:54)at com.mydomain.commonlibrary.file.FileTransferServiceTest.setup(FileTransferServiceTest.java:62)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132)at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:95)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)


分析:

PowerMock中为支持对构造函数的测试,借助于Javassist实现对字节码的操作。但是从Java 6开始引入的Stack Map Frames特性与Javassist不兼容。在Java 6中该Stack Map Frames还是可选的。但是到了Java 7,该Stackmap Frames已经是默认使用的,所以不兼容问题导致了该异常。

解决:

解决方案有2个,一个是改变JVM的配置,一个是改变Javassist。Javassist目前的最新版本3.21.0-GA还不兼容该特性。

这里,我们为单元测试设置如下JVM 7参数,以禁用该Stack Map Frames特性。

-XX:-UseSplitVerifier


如果使用Maven的maven-surefire-plugin插件进行测试,还需要为该插件设置启动参数如下:

<pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19.1</version><configuration><argLine>-XX:-UseSplitVerifier</argLine></configuration></plugin></plugins>
</pluginManagement>

但是对于Java 8,由于上述JVM参数以及不存在,所以Stack Map Frames特性导致的字节码操作工具的兼容性问题无法避免。

 

参考文献:

http://blog.triona.de/development/jee/how-to-use-powermock-with-java-7.html

http://jboss-javassist.github.io/javassist/

http://chrononsystems.com/blog/java-7-design-flaw-leads-to-huge-backward-step-for-the-jvm

 

这篇关于PowerMock的java.lang.VerifyError: Inconsistent stackmap frames at branch target异常分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/797723

相关文章

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2