I'm getting an IllegalClassFormatException when running tests with jacoco, when the class under test creates an instance of a class that is mocked by the test. Here's a simple example:
[jacoco:coverage] Enhancing junit with coverage
[junit] Testsuite: TestCounter
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.716 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] in static initializer of Counter!
[junit] in TestCounter.setup
[junit] in TestCounter.testAdd
[junit] in Counter.addOne
[junit] in TestCounter.teardown
[junit] ------------- ---------------- ---------------
[junit] ------------- Standard Error -----------------
[junit] java.lang.instrument.IllegalClassFormatException: Error while instrumenting class Counter2.
[junit] at org.jacoco.agent.rt_plkeqq.CoverageTransformer.transform(CoverageTransformer.java:94)
[junit] at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
[junit] at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
[junit] at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
[junit] at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:170)
[junit] at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:244)
[junit] at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:238)
[junit] at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:166)
[junit] at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:159)
[junit] at mockit.Mockit.setUpMock(Mockit.java:425)
[junit] at TestCounter.setUp(TestCounter.java:13)
[junit] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[junit] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[junit] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[junit] at java.lang.reflect.Method.invoke(Method.java:601)
[junit] at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
[junit] at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
[junit] at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
[junit] at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
[junit] at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
[junit] at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
[junit] at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
[junit] at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
[junit] at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
[junit] at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
[junit] at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
[junit] at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
[junit] at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
[junit] at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
[junit] at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911)
[junit] Caused by: java.lang.NoSuchFieldException: $jacocoData
[junit] at java.lang.Class.getDeclaredField(Class.java:1899)
[junit] at org.jacoco.agent.rt_plkeqq.core.runtime.AbstractRuntime.disconnect(AbstractRuntime.java:88)
[junit] at org.jacoco.agent.rt_plkeqq.CoverageTransformer.transform(CoverageTransformer.java:90)
[junit] ... 32 more
[junit] java.lang.instrument.IllegalClassFormatException: Error while instrumenting class Counter2.
[junit] at org.jacoco.agent.rt_plkeqq.CoverageTransformer.transform(CoverageTransformer.java:94)
[junit] at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
[junit] at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
[junit] at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
[junit] at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:170)
[junit] at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:244)
[junit] at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:238)
[junit] at mockit.internal.RedefinitionEngine.restoreOriginalDefinition(RedefinitionEngine.java:285)
[junit] at mockit.internal.state.MockFixture.restoreAndRemoveRedefinedClasses(MockFixture.java:128)
[junit] at mockit.Mockit.tearDownMocks(Mockit.java:454)
[junit] at TestCounter.tearDown(TestCounter.java:20)
[junit] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[junit] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[junit] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[junit] at java.lang.reflect.Method.invoke(Method.java:601)
[junit] at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
[junit] at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
[junit] at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
[junit] at mockit.integration.junit4.internal.JUnit4TestRunnerDecorator.invokeExplosively(JUnit4TestRunnerDecorator.java:53)
[junit] at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java)
[junit] at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:36)
[junit] at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
[junit] at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
[junit] at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
[junit] at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
[junit] at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
[junit] at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
[junit] at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
[junit] at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
[junit] at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
[junit] at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911)
[junit] Caused by: java.lang.NoSuchFieldException: $jacocoData
[junit] at java.lang.Class.getDeclaredField(Class.java:1899)
[junit] at org.jacoco.agent.rt_plkeqq.core.runtime.AbstractRuntime.disconnect(AbstractRuntime.java:88)
[junit] at org.jacoco.agent.rt_plkeqq.CoverageTransformer.transform(CoverageTransformer.java:90)
[junit] ... 33 more
[junit] ------------- ---------------- ---------------
Also the report task shows that Counter.addOne was not covered, although looking at the output it was indeed executed.
I've attached a zip of a situation to reproduce this. Just extracting the zip and running ant should show the problem I'm seeing.