If the Jacoco only throws error for the classes that jmockit mocked, so I
assume the coverage report will still be correct? Since we don't test the
mocked classes and they should not be counted in the jacoco code coverage
report. But when other tests execute the class that was previously mocked ,
will jacoco be able to calculate the code coverage correctly?
My question is that will this error, Class org/testng/internal/Parameters is
already instrumented, affect the correctness of the code coverage report?
On Thursday, September 20, 2012 at 10:20:02 AM UTC-7, Jim Anderson wrote:
> 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:
>
>
>
> public class Counter {
>
> // Counter2 will be mocked by the test!
> private static Counter2 counter2;
>
> static {
> System.out.println("in static initializer of Counter!");
> counter2 = new Counter2();
> }
>
> public Integer addOne(Integer input) {
> System.out.println("in Counter.addOne");
> return ++input;
> }
>
> public Integer addTwo(Integer input) {
> return input + 2;
> }
> }
>
>
>
>
>
> public class Counter2 {
>
>
> public Integer addFive(Integer num) {
> return num + 5;
> }
>
>
> }
>
>
>
>
>
> public class TestCounter {
>
> @Before
> public void setUp() {
> Mockit.setUpMock(MockCounter.class);
> Mockit.setUpMock(MockCounter2.class);
> System.out.println("in TestCounter.setup");
> }
>
> @After
> public void tearDown() {
> System.out.println("in TestCounter.teardown");
> Mockit.tearDownMocks();
> }
>
> @Test
> public void testAdd() {
> System.out.println("in TestCounter.testAdd");
> Counter c = new Counter();
> assertEquals((Integer) 3, c.addOne(2));
> }
>
> @MockClass(realClass = Counter.class)
> public static class MockCounter {
>
> public static Integer num = new Integer(1);
>
> @Mock
> public Integer addTwo(Integer input) {
> System.out.println("in mocked addTwo!!!!!");
> return new Integer(1);
> }
> }
>
> @MockClass(realClass = Counter2.class)
> public static class MockCounter2 {
>
>
> @Mock
> public Integer addFive(Integer num) {
> System.out.println("in MockCounter2.addFive");
> return new Integer(5);
> }
> }
> }
>
>
> This is the output including the stack trace:
>
>
>
> [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.
--
You received this message because you are subscribed to the Google Groups
"JaCoCo and EclEmma Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jacoco/a964b782-1ff7-44f8-b3f6-bb9c51e9932b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.