声纳(jacoco)+ jmockit垃圾邮件有例外

时间:2013-05-31 10:58:54

标签: java sonarqube jmockit jacoco

我正面临一个错误,开始真的很烦人 这是我有的: 1)使用JaCoCo作为覆盖工具的Sonar 3.5。 2)Jmockit lib使用模拟执行测试。 3)使用maven自动化构建过程。

所以,当我第一次运行mvn clean install时,我正在运行mvn sonar:sonar以及此处发生的事情:

  • Jmockit似乎需要它所需的类。
  • JaCoCo无法检测已经由Jmockit检测过的类并吐出大量异常,并表示不可能对已经检测过的类进行检测。 然而,声纳似乎对这种情况有一个有效的输出 所以第一个问题是:我可以以某种方式抑制这种例外吗?这非常关键,因为CI系统上的日志文件大小达到50Mb(!),这是不可接受的。我们的CI机器上的这些日志会占用大量的可用空间。

以下是我的例外情况:

java.lang.instrument.IllegalClassFormatException: Error while instrumenting class app/MyClass.
Caused by: java.lang.IllegalStateException: Class app/MyClass is already instrumented.

假设无法抑制此类异常,我稍微调查了一下,发现JaCoCo(一种Sonar使用的工具和一种无法检测已经检测过的类的工具)具有{{{{{ 1}}(AFAIK声纳不支持此offline instrumentation或可以抑制此类警告)。这个东西设计用于这种情况。所以我尝试将JaCoCo设置为maven中的插件,但我没有这样做,因为JaCoCo无法找到一些执行文件。当我正在运行offline instrumentation时,会弹出以下错误:

  

[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:报告(报告)@ webservice-mws ---   [INFO]由于缺少执行数据文件而跳过JaCoCo执行

如果我没弄错,这个执行文件是JaCoCo插件的结果。我很沮丧,不知道该怎么做。

如果有人可以帮助我,我们将不胜感激! 提前谢谢!

我的JaCoCo插件的pom.xml设置:

mvn clean install

4 个答案:

答案 0 :(得分:4)

您可以使用Cobertura作为Sonar 3.5.1的代码覆盖率。

要改变它:

  1. 以管理员身份登录
  2. 转到设置>构造
  3. 常规设置类别>爪哇
  4. 设置代码覆盖率插件= cobertura
  5. 在我的项目上像魅力一样工作^ _-

答案 1 :(得分:2)

据我所知消息“Class app / MyClass已经过检测。”表示此类已由JaCoCo检测。以下是可能发生这种情况的一些可能原因:

  • 与在线混合的离线工具 - 它们应该专门用于
  • 在测试期间连接到JVM的两个JaCoCo代理 - 这可能发生,因为Sonar尝试自动附加JaCoCo代理并执行测试,jacoco-maven-plugin也附加代理,所以为了避免这一点,请查看属性“sonar” .dynamicAnalysis = reuseReports“或者不使用jacoco-maven-plugin,Sonar将自己完成这项工作

对我来说,你的消息看起来有点难以理解配置,所以我不能准确地说出你面对的是哪种情况,而是我在第二种情况下的赌注。

希望这些信息对您有用。如果这不能帮助您解决问题,请随时回到Sonar用户邮件列表。

答案 2 :(得分:1)

我遇到了同样的问题。它似乎是在jacoco插件0.7.1+中修复的。我使用的是0.7.3.201502191951,问题随之消失了。

本质上,jMockit代理在JaCoCo代理看到它们之前加载类并重新转换它们。之后,JaCoCo无法再执行所需的仪器。看到这个链接

https://github.com/jacoco/jacoco/issues/208

答案 3 :(得分:0)

问题是JMockit"重新加载"嘲笑他们的班级。然后JaCoCo再次试图对它们进行检测。此时发生错误。

注意:模拟接口不会发生这种情况。

运行EclEmma + JaCoCo

时,请参阅以下堆栈跟踪
java.lang.instrument.IllegalClassFormatException: Error while instrumenting class com/company/AbstractClass.
    at org.jacoco.agent.rt.internal_9dd1198.CoverageTransformer.transform(CoverageTransformer.java:89)
    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:260)
    at mockit.internal.RedefinitionEngine.redefineClasses(RedefinitionEngine.java:26)
    at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClass(BaseTypeRedefinition.java:172)
    at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClassAndItsSuperClasses(BaseTypeRedefinition.java:147)
    at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineMethodsAndConstructorsInTargetType(BaseTypeRedefinition.java:134)
    at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineTargetClassAndCreateInstanceFactory(BaseTypeRedefinition.java:197)
    at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineType(BaseTypeRedefinition.java:57)
    at mockit.internal.expectations.mocking.TypeRedefinition.redefineType(TypeRedefinition.java:47)
    at mockit.internal.expectations.mocking.SharedFieldTypeRedefinitions.redefineTypeForMockField(SharedFieldTypeRedefinitions.java:60)
    at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldType(FieldTypeRedefinitions.java:48)
    at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldTypes(FieldTypeRedefinitions.java:38)
    at mockit.internal.expectations.mocking.SharedFieldTypeRedefinitions.redefineTypesForTestClass(SharedFieldTypeRedefinitions.java:43)
    at mockit.integration.internal.TestRunnerDecorator.handleMockFieldsForWholeTestClass(TestRunnerDecorator.java:135)
    at mockit.integration.internal.TestRunnerDecorator.updateTestClassState(TestRunnerDecorator.java:34)
    at mockit.integration.junit4.internal.JUnit4TestRunnerDecorator.handleMockingOutsideTestMethods(JUnit4TestRunnerDecorator.java:107)
    at mockit.integration.junit4.internal.JUnit4TestRunnerDecorator.invokeExplosively(JUnit4TestRunnerDecorator.java:37)
    at mockit.integration.junit4.internal.MockFrameworkMethod.invokeExplosively(MockFrameworkMethod.java:32)
    at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at mockit.internal.util.MethodReflection.invokeWithCheckedThrows(MethodReflection.java:106)
    at mockit.internal.mockups.MockMethodBridge.callMock(MockMethodBridge.java:85)
    at mockit.internal.mockups.MockMethodBridge.invoke(MockMethodBridge.java:44)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.io.IOException: Error while instrumenting class com/afklm/cco/slt/integrator/batch/AbstractData.
    at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrumentError(Instrumenter.java:147)
    at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrument(Instrumenter.java:98)
    at org.jacoco.agent.rt.internal_9dd1198.CoverageTransformer.transform(CoverageTransformer.java:87)
    ... 44 more
Caused by: java.lang.IllegalStateException: Class com/company/AbstractClass is already instrumented.
    at org.jacoco.agent.rt.internal_9dd1198.core.internal.instr.InstrSupport.assertNotInstrumented(InstrSupport.java:81)
    at org.jacoco.agent.rt.internal_9dd1198.core.internal.instr.ClassInstrumenter.visitField(ClassInstrumenter.java:79)
    at org.jacoco.agent.rt.internal_9dd1198.asm.ClassVisitor.visitField(Unknown Source)
    at org.jacoco.agent.rt.internal_9dd1198.asm.ClassReader.a(Unknown Source)
    at org.jacoco.agent.rt.internal_9dd1198.asm.ClassReader.accept(Unknown Source)
    at org.jacoco.agent.rt.internal_9dd1198.asm.ClassReader.accept(Unknown Source)
    at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrument(Instrumenter.java:78)
    at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrument(Instrumenter.java:96)
    ... 45 more