Mockito-inline模式下IDEA调式无法获取成员信息
[!info] 环境 Environment
系统: ArchLinux LinuxKernel 6.0
JDK: alibaba open jdk 8
IDE: IDEA U 2022.3
Maven: mockito:3.9.0,mockito-inline:4.5.0
问题描述
idea在单元测试调试中,使用了mockito-core和mockito-inline框架,发现mock的对象中成员无法被监视,报this是不可用的错误信息。
解决方案
升级mockito版本>=3.11.0即可,建议mockito-core和mockito-inline版本需要保持一致。
如果无法修改mockito版本(可能是SpringBoot引入了),则可以更新Byte Buddy版本到1.11.1,参考如下:
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
<version>1.11.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.11.1</version>
<scope>test</scope>
</dependency>
问题原因
具体可以参考这篇issues
结论为:由于mockit-inline底层依赖ByteBuddy来实现字节码修改技术,他会将方法的局部变量表中slot为0的位置修改(原先为this,改为他自己的东西)。然而idea等IDE在调试时根据当前方法的局部变量表中的信息来实现监视相关的功能。由于slot为0的位置发声了改变不再为this了,因此idea就会提示this是不可用的。
最后社区定位到了问题源头来源于ByteBuddy,并且在3.11.0的mockito版本中通过更新mockito-core的ByteBuddy相关依赖版本来解决。
给项目提供的hot-fix方案是更新了ByteBuddy的依赖版本,当然更好的方案是通过升级mockit的几个依赖版本,但是可能回涉及到spring-boot-stater-test的升级,风险较大。