添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am trying to use EMMA to measure coverage of some JUnit tests that use JMockit. But when I try to run the JMockit tests after instrumenting with EMMA, about a quarter of the tests fail with the following error:

com.logstorage.engine.sensor.SensorManagerTest.setUpBeforeClass(SensorManagerTest.java:98)
    java.lang.ClassFormatError
    at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
    at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:150)
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:152)
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:139)
    at mockit.internal.RedefinitionEngine.redefineMethods(RedefinitionEngine.java:73)
    at mockit.Mockit.setUpMock(Mockit.java:235)
    at com.myapp.MyTest.setUpBeforeClass(MyTest.java:98)

I can't see any pattern as to which tests fail and which don't. I guess this is just a bug in JMockit, but does anybody know a workaround?

I found a very similar question called "Getting ClassFormatError with EMMA?" but the solution doesn't work for me (I'm not using any reentrant=true mock methods). Any other ideas?

Thanks in advance.

It must be the alignment of the Moon. With nothing changed I wasn't getting this error two days ago! – Cem Catikkas May 28, 2009 at 21:15

I have been running into the same problem - this seems to have fixed it for me and hopefully will help anybody else as well.

If you're running this through ant, make sure you don't have vars in your javac target's debuglevel argument. The following target will cause the error.

<javac srcdir="${src}" destdir="${bin}" debug="on" debuglevel="lines,source,vars" nowarn="true" /> 

Change it to:

<javac srcdir="${src}" destdir="${bin}" debug="on" debuglevel="lines,source" nowarn="true">

This is probably a JMockit bug - very subtle and annyoing to find out.

I only saw this question today, but if you can, send me some tests that throw the ClassFormatError when running with EMMA, and I will try to find the bug in JMockit.

By the way, have you tried to use JMockit Coverage? Just add jmockit-coverage.jar to the classpath, and see what you get. Typically, this will produce (without any extra configuration) a nice HTML coverage report in the "coverage-report" dir under the working dir. It can't get any easier than that!

Thanks for the offer, but this problem was on a project at work, and I don't think my company would be pleased with me sending you bits of the source. If I manage to make an example test that exhibits the problem, I'll let you know. I haven't tried JMockit Coverage. I'll check it out! The main reason I use EMMA is that it has good plugins for both Eclipse and Hudson. – Chris B Jul 1, 2009 at 2:34

My team had the same issue. The concrete case was: using jMockit to mock static methods from a class in a unit-test suite running under TeamCity with EMMA as the coverage tool. The solution was the following:

Add a tear-down method to each test which mocked static methods:

@After
public void tearDown() throws Exception {
  Mockit.tearDownMocks(ClassWithStaticMethods.class);
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.