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).
https://github.com/jacoco/jacoco/pull/35
0 0
- jmockit jacoco冲突
- Jmockit
- jmockit
- jmockit
- JMockit
- jmockit
- JMockit
- JaCoCo can not instrument classes which is already instrumented by Jmockit
- Jacoco
- Jacoco
- Jmockit实用技巧
- Jmockit入门
- jmockit junit
- Jmockit使用指南
- jmockit配置
- Jmockit使用指南
- JMockit概述
- Jmockit使用指南
- KBE CellApp 跟 Space 的关系
- Yii 2.0邮箱类的简单应用
- IntentFilter 的匹配规则
- 关于JVM与内存溢出
- python模块2
- jmockit jacoco冲突
- cento7配置vsftpd遇到550错误的解决办法
- 【多线程-Sleep()和Interrup()方法】
- C#中base的用法
- HashMap实现原理分析
- HTTP连接管理的那些事儿
- CSS小姿势
- 居中滚动的Recyclerview
- 主题更换的实现实录