Sonar (jacoco) + JMockit спамілі з выключэннямі

Я сутыкнуўся памылку, якая пачынае быць сапраўды раздражняе.
Вось што ў мяне ёсць: 1) Sonar 3.5, які выкарыстоўвае JaCoCo ў якасці інструмента пакрыцця. 2) JMockit Lib для выканання тэставання з выкарыстаннем здзекуецца. 3) Працэс зборкі аўтаматызаваны з мавена.

Таму, калі я запускаю першы MVN чыстую ўстаноўку , які ў парадку, а затым я бягу МВН гідралакатара: сонар і што адбываецца тут:

  • JMockit здаецца, прыборных класаў гэта неабходна.
  • JaCoCo не можа прыборныя класы, якія ўжо инструментированные па JMockit і выплёўвае ОГРОМНОЕ колькасць выключэнняў, кажучы, што гэта немагчыма класу прыбораў, якія ўжо былі апераваць. Аднак Sonar, здаецца, правільны выхад для такога сцэнару.
    Таму першае пытанне: ці магу я нейкім чынам здушыць такое выключэнне? Гэта сапраўды важна, таму што памер файла часопіса ў нашай сістэме 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 (інструмент, які выкарыстоўвае сонар і інструмент, які можа не інструмент ужо інструментальныя класы) мае такі рэжым, як аўтаномных прыборы (AFAIK Sonar ні падтрымліваць гэты адсутнічае прыборны або можа падавіць такое папярэджанне). Гэтая рэч прызначана для выкарыстання менавіта для такіх выпадкаў. Так што я спрабаваў наладзіць JaCoCo як убудова ў мавена, але я не ў стане зрабіць гэта справа JaCoCo не можа знайсці нейкі файл выканання. Калі я бягу MVN чыстую ўстаноўку наступная памылка выскоквае:

[INFO] --- jacoco-Maven-убудова: 0.6.2.201302030002: справаздачу (справаздачу) @ WebService-MWS ---   [INFO] Выкананне Skipping JaCoCo з-за адсутнасці файла дадзеных выканання

Калі я не памыляюся, гэты файл выкананне ВЫНІК плагіна JaCoCo. Я цалкам расчараваны і не ведаю, што рабіць з гэтым.

Калі хто-то можа дапамагчы мне з гэтым будзе вельмі ўдзячны!
Загадзя дзякую!

мае налады pom.xml для JaCoCo плагіна:

             
                org.jacoco
                jacoco-maven-plugin
                0.6.2.201302030002
                
                    
                        process-test-resources
                        
                            prepare-agent
                        
                    
                    
                        report
                        verify
                        
                            report
                        
                    
                
            
4
@Dennys, так, гэта, здаецца, адзінае рашэнне тут, каб перайсці сонар іншы інструмент пакрыцця кода, як Cobertura.
дададзена аўтар mr.nothing, крыніца
@Dennys, так, гэта, здаецца, адзінае рашэнне тут, каб перайсці сонар іншы інструмент пакрыцця кода, як Cobertura.
дададзена аўтар mr.nothing, крыніца
@Dennys, так, гэта, здаецца, адзінае рашэнне тут, каб перайсці сонар іншы інструмент пакрыцця кода, як Cobertura.
дададзена аўтар mr.nothing, крыніца
У мяне такая ж праблема, але я не »выкарыстоўваць jmocket. Але, падобна, JaCoCo не падтрымліваюць насмешлівыя рамкі, вы можаце спасылацца на groups.google.com/forum/# тзд/& hellip ;!
дададзена аўтар Dennys, крыніца

13 адказы

Вы можаце выкарыстоўваць Cobertura ў якасці пакрыцця кода на Sonar 3.5.1.

Для таго, каб змяніць яго:

  1. Login as admin
  2. Go to Settings > Configuration
  3. In General Settings Category > Java
  4. Set Code coverage plugin = cobertura

Працаваў як шарм на маім праекце ^ _-

4
дададзена
Гэта лепшы адказ! Дзякуй, што працавалі для нас, як добра!
дададзена аўтар mr.nothing, крыніца

Вы можаце выкарыстоўваць Cobertura ў якасці пакрыцця кода на Sonar 3.5.1.

Для таго, каб змяніць яго:

  1. Login as admin
  2. Go to Settings > Configuration
  3. In General Settings Category > Java
  4. Set Code coverage plugin = cobertura

Працаваў як шарм на маім праекце ^ _-

4
дададзена
Гэта лепшы адказ! Дзякуй, што працавалі для нас, як добра!
дададзена аўтар mr.nothing, крыніца

Вы можаце выкарыстоўваць Cobertura ў якасці пакрыцця кода на Sonar 3.5.1.

Для таго, каб змяніць яго:

  1. Login as admin
  2. Go to Settings > Configuration
  3. In General Settings Category > Java
  4. Set Code coverage plugin = cobertura

Працаваў як шарм на маім праекце ^ _-

4
дададзена
Гэта лепшы адказ! Дзякуй, што працавалі для нас, як добра!
дададзена аўтар mr.nothing, крыніца

Па майму разуменню гэтага даследавання: Можна таксама выкарыстоўваць аўтаномныя-інструментальныя класы з агентам JaCoCo Java. У гэтым выпадку канфігурацыя бяруцца з параметраў агента. Агент павінен быць сканфігураваны такім чынам, што папярэдне інструментальнымі класы выключаны, напрыклад, з "выключае = *". У адваротным выпадку гэта прывядзе да паведамленняў пра памылкі на кансолі, калі інструменты агента такіх класаў зноў Сапраўды гэтак жа ў вашым выпадку. Jacoco запіс плагіна: -

 
      
          * 
      

Агент jacocoagent.jar з'яўляецца часткай размеркавання JaCoCo і ўключае ў сябе ўсю неабходную залежнасць. Агент Java можа быць актываваны з дапамогай наступнай опцыі JVM (у камандным радку):

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]

For JaCoCo agent options, consider the following link: http://www.jacoco.org/jacoco/trunk/doc/agent.html

Як агент jacocoagent.jar з'яўляецца часткай дыстрыбутыва JaCoCo, ён атрымлівае аўтаматычна ўключаецца ў параметры argLine і не павінен быць усталяваны ў відавочным выглядзе, але мы павінны праверыць, калі jacocoagent.jar паказаны, як ўстаноўлены ў argLine пры выкананні МВН чыстай ўстаноўкі каманды

2
дададзена
працаваў для мяне, як добра.
дададзена аўтар Deepak S, крыніца

Па майму разуменню гэтага даследавання: Можна таксама выкарыстоўваць аўтаномныя-інструментальныя класы з агентам JaCoCo Java. У гэтым выпадку канфігурацыя бяруцца з параметраў агента. Агент павінен быць сканфігураваны такім чынам, што папярэдне інструментальнымі класы выключаны, напрыклад, з "выключае = *". У адваротным выпадку гэта прывядзе да паведамленняў пра памылкі на кансолі, калі інструменты агента такіх класаў зноў Сапраўды гэтак жа ў вашым выпадку. Jacoco запіс плагіна: -

 
      
          * 
      

Агент jacocoagent.jar з'яўляецца часткай размеркавання JaCoCo і ўключае ў сябе ўсю неабходную залежнасць. Агент Java можа быць актываваны з дапамогай наступнай опцыі JVM (у камандным радку):

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]

For JaCoCo agent options, consider the following link: http://www.jacoco.org/jacoco/trunk/doc/agent.html

Як агент jacocoagent.jar з'яўляецца часткай дыстрыбутыва JaCoCo, ён атрымлівае аўтаматычна ўключаецца ў параметры argLine і не павінен быць усталяваны ў відавочным выглядзе, але мы павінны праверыць, калі jacocoagent.jar паказаны, як ўстаноўлены ў argLine пры выкананні МВН чыстай ўстаноўкі каманды

2
дададзена
працаваў для мяне, як добра.
дададзена аўтар Deepak S, крыніца

Наколькі я ведаю, паведамленне «прыкладанне Class/MyClass ўжо інструментальнае.» азначае, што гэты клас ўжо інструментальны па JaCoCo. Вось некаторыя з магчымых прычын, чаму гэта можа адбыцца:

  • адсутнічае апаратура змяшаны з онлайн - яны павінны быць выкарыстаны выключна
  • два агента JaCoCo прымацаваныя да JVM падчас выпрабаванняў - гэта можа адбыцца, таму што Sonar спрабуе аўтаматычна далучаць JaCoCo агента і выконваць тэсты, і jacoco-Maven-убудова таксама надае агент, таму, каб пазбегнуць гэтага, паглядзіце на маёмасць «сонар .dynamicAnalysis = reuseReports »ці не выкарыстоўваць jacoco-Maven-убудова і Sonar будзе рабіць працу па сваёй

Для мяне ваша паведамленне выглядае трохі складаным для разумення канфігурацыі, таму я не магу дакладна сказаць, які з вышэйпералічаных вамі выпадках вы сутыкнуліся, але мая стаўка на другі.

Спадзяюся, што гэтая інфармацыя будзе карысная для Вас. Не саромейцеся, каб вярнуцца ў Sonar спісу рассылання, калі гэта не дапаможа вам вырашыць праблему.

2
дададзена

Наколькі я ведаю, паведамленне «прыкладанне Class/MyClass ўжо інструментальнае.» азначае, што гэты клас ўжо інструментальны па JaCoCo. Вось некаторыя з магчымых прычын, чаму гэта можа адбыцца:

  • адсутнічае апаратура змяшаны з онлайн - яны павінны быць выкарыстаны выключна
  • два агента JaCoCo прымацаваныя да JVM падчас выпрабаванняў - гэта можа адбыцца, таму што Sonar спрабуе аўтаматычна далучаць JaCoCo агента і выконваць тэсты, і jacoco-Maven-убудова таксама надае агент, таму, каб пазбегнуць гэтага, паглядзіце на маёмасць «сонар .dynamicAnalysis = reuseReports »ці не выкарыстоўваць jacoco-Maven-убудова і Sonar будзе рабіць працу па сваёй

Для мяне ваша паведамленне выглядае трохі складаным для разумення канфігурацыі, таму я не магу дакладна сказаць, які з вышэйпералічаных вамі выпадках вы сутыкнуліся, але мая стаўка на другі.

Спадзяюся, што гэтая інфармацыя будзе карысная для Вас. Не саромейцеся, каб вярнуцца ў Sonar спісу рассылання, калі гэта не дапаможа вам вырашыць праблему.

2
дададзена

Наколькі я ведаю, паведамленне «прыкладанне Class/MyClass ўжо інструментальнае.» азначае, што гэты клас ўжо інструментальны па JaCoCo. Вось некаторыя з магчымых прычын, чаму гэта можа адбыцца:

  • адсутнічае апаратура змяшаны з онлайн - яны павінны быць выкарыстаны выключна
  • два агента JaCoCo прымацаваныя да JVM падчас выпрабаванняў - гэта можа адбыцца, таму што Sonar спрабуе аўтаматычна далучаць JaCoCo агента і выконваць тэсты, і jacoco-Maven-убудова таксама надае агент, таму, каб пазбегнуць гэтага, паглядзіце на маёмасць «сонар .dynamicAnalysis = reuseReports »ці не выкарыстоўваць jacoco-Maven-убудова і Sonar будзе рабіць працу па сваёй

Для мяне ваша паведамленне выглядае трохі складаным для разумення канфігурацыі, таму я не магу дакладна сказаць, які з вышэйпералічаных вамі выпадках вы сутыкнуліся, але мая стаўка на другі.

Спадзяюся, што гэтая інфармацыя будзе карысная для Вас. Не саромейцеся, каб вярнуцца ў Sonar спісу рассылання, калі гэта не дапаможа вам вырашыць праблему.

2
дададзена

У мяне была тая ж праблема. Аказваецца, павінна быць зафіксавана ў jacoco убудова 0.7.1+. Я выкарыстоўваю 0.7.3.201502191951 і праблема сышла для мяне.

Па сутнасці агент JMockit загружае класы і retransforms іх да таго, як агент JaCoCo бачыць іх. Пасля гэтага JaCoCo не можа выканаць неабходныя кантрольна-вымяральныя прыборы больш. глядзіце па гэтай спасылцы

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

1
дададзена

У мяне была тая ж праблема. Аказваецца, павінна быць зафіксавана ў jacoco убудова 0.7.1+. Я выкарыстоўваю 0.7.3.201502191951 і праблема сышла для мяне.

Па сутнасці агент JMockit загружае класы і retransforms іх да таго, як агент JaCoCo бачыць іх. Пасля гэтага JaCoCo не можа выканаць неабходныя кантрольна-вымяральныя прыборы больш. глядзіце па гэтай спасылцы

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

1
дададзена

Праблема заключаецца ў тым 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
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
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
0
дададзена