2009-05-25 2 views
3

J'essaie d'utiliser EMMA pour mesurer la couverture de certains tests JUnit qui utilisent JMockit. Mais lorsque je tente de lancer les tests de JMockit après instrumentant avec EMMA, environ un quart des tests échouent avec l'erreur suivante:ClassFormatError utilisant JMockit avec EMMA

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) 

Je ne vois aucun modèle à qui tests échouent et qui ne le font pas . Je suppose que c'est juste un bug dans JMockit, mais quelqu'un sait-il une solution de contournement?

J'ai trouvé une question très similaire appelée "Getting ClassFormatError with EMMA?" mais la solution ne marche pas pour moi (je n'utilise pas de méthode réentrante = true). D'autres idées?

Merci d'avance.

+0

Ce doit être l'alignement de la Lune. Si rien n'a changé, je n'ai pas eu cette erreur il y a deux jours! –

Répondre

2

J'ai rencontré le même problème - cela semble l'avoir réglé pour moi et j'espère que cela aidera aussi les autres.

Si vous utilisez ce par ant, assurez-vous que vous n'avez pas vars dans votre argument de cible javacdebuglevel. La cible suivante provoquera l'erreur.

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

Modifier à:

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

Ceci est probablement un bug JMockit - très subtile et annyoing pour savoir.

+0

Ça a marché! Vous êtes un sauveur de vie! C'était quelque chose que j'avais abandonné comme "unfixable" :) –

0

J'ai seulement vu cette question aujourd'hui, mais si vous pouvez, envoyez-moi quelques tests qui lancent le ClassFormatError en cours d'exécution avec EMMA, et j'essaierai de trouver le bogue dans JMockit. Par ailleurs, avez-vous essayé d'utiliser JMockit Coverage? Ajoutez simplement jmockit-coverage.jar au classpath, et voyez ce que vous obtenez. Généralement, ceci produira (sans aucune configuration supplémentaire) un bon rapport de couverture HTML dans le répertoire "coverage-report" sous le répertoire de travail. Ça ne peut pas être plus facile que ça!

+0

Merci pour l'offre, mais ce problème était sur un projet au travail, et je ne pense pas que mon entreprise serait contente de m'envoyer des bribes de la source. Si je parviens à faire un exemple de test qui présente le problème, je vous le ferai savoir. Je n'ai pas essayé la couverture JMockit. Je vérifierai! La principale raison pour laquelle j'utilise EMMA est qu'il a de bons plugins pour Eclipse et Hudson. –

+0

Hey Rogerio, laissez-moi voir si je peux vous obtenir une classe représentative à repro. –

0

Mon équipe a eu le même problème. Le cas concret était: utiliser jMockit pour se moquer des méthodes statiques d'une classe dans une suite de tests unitaires fonctionnant sous TeamCity avec EMMA comme outil de couverture. La solution est la suivante:

Ajouter une méthode de démontage pour chaque test qui se moque des méthodes statiques:

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

Mise à jour jmockit de 1,5 à une version plus récente.

Questions connexes