Hi,

JaCoCo can distinguish between different versions of a class. So in your case the coverage for the non-mocked version of class "Parameters" should be correct.

Regards,
-marc

On 16.12.15 22:33, [email protected] wrote:
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/5672591A.7050603%40mountainminds.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to