jmockit jacoco冲突

来源:互联网 发布:纳什生涯总数据 编辑:程序博客网 时间:2024/05/20 13:40

背景

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


0 0
原创粉丝点击