jmockit jacoco冲突

jmockit和jacoco在java测试中分别用于mock和覆盖率统计,但同时使用可能导致错误。冲突源于两者都利用jdk的instrument技术修改字节码。解决方案是将jmockit更新至1.8以上版本,jacoco升级至0.7.3以上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

jmockit是单测mock框架  http://jmockit.org

jacoco是测试覆盖率工具 http://eclemma.org/jacoco/

问题

两者在java开发的测试上都有不错的表现,但是在一起使用时,可能会出现水土不服:

比如像:

java.lang.instrument.IllegalClassFormatException: Error while instrumenting class xxx类.
    at org.jacoco.agent.rt_1r70et.CoverageTransformer.transform(CoverageTransformer.java:94)
    at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
    at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
    at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
    at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:170)
    at mockit.internal.startup.Startup.redefineMethods(Startup.java:124)
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:63)

或着像

java.lang.ClassCircularityError: xxx类
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at mockit.internal.util.ClassLoad.loadClass(ClassLoad.java:100)
	at mockit.internal.util.ClassLoad.loadClass(ClassLoad.java:48)
	at mockit.internal.util.ClassLoad.loadByInternalName(ClassLoad.java:29)
	at mockit.internal.expectations.transformation.InvocationBlockModifier.visitFieldInsn(InvocationBlockModifier.java:141)
	at mockit.external.asm.ClassReader.readCode(ClassReader.java:1414)
	at mockit.external.asm.ClassReader.readMethod(ClassReader.java:1017)
	at mockit.external.asm.ClassReader.accept(ClassReader.java:693)
	at mockit.external.asm.ClassReader.accept(ClassReader.java:506)
	at mockit.internal.expectations.transformation.ExpectationsTransformer.transform(ExpectationsTransformer.java:131)
	at sun.instrument.TransformerManager.transform(TransformerManager.java:169)
	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)

等诡异错误。

原因

原因主要是因为jmockit和jacoco都同样使用了jdk的instrument技术,通过修改类的字节码并替换,使得单测在运行时能按指定mock行为运行,和统计覆盖率。

但是一个类不能同时被2个框架这么处理,所以就出现了上面错误。

解决方案

解决办法很简单,jmockit和jacoco的作者交流了后,各自升级了自己的框架,使之能彼此兼容:

jmockit升级到1.8以后

jmockit 1.8 change log:

JMockit now works fine with the JaCoCo code coverage tool, provided version 0.7.1 or newer of JaCoCo is used (an snapshot build of this version is currently available).

jacoco升级到0.7.3以后

jacoco 0.7.3 change log:

Exclude dynamically generated classes from instrumentation for better interoperability with JMockit, analysis contributed by Rogério Liesenfeld (GitHub #272).



REF:

https://github.com/jacoco/jacoco/pull/35


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值