2009-05-25 6 views
3

Ich versuche EMMA zu verwenden, um die Abdeckung einiger JUnit-Tests zu messen, die JMockit verwenden. Aber wenn ich versuche, die JMockit Tests zu laufen, nachdem sie mit EMMA instrumentiert, etwa ein Viertel der Tests fehlschlagen mit dem folgenden Fehler:ClassFormatError mit JMockit mit 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) 

ich kein Muster erkennen kann, auf die nicht überprüft und welche nicht . Ich denke, das ist nur ein Fehler in JMockit, aber kennt jemand einen Workaround?

Ich habe eine sehr ähnliche Frage namens "Geting ClassFormatError mit EMMA?" aber die Lösung funktioniert nicht für mich (ich benutze keine Reentrant = True Mock-Methoden). Irgendwelche anderen Ideen?

Vielen Dank im Voraus.

+0

Es muss die Ausrichtung des Mondes sein. Mit nichts verändert habe ich diesen Fehler vor zwei Tagen nicht bekommen! –

Antwort

2

Ich bin auf das gleiche Problem gestoßen - das scheint es für mich repariert zu haben und hoffentlich auch anderen zu helfen.

Wenn Sie dies durch ant laufen lassen, stellen Sie sicher, Sie haben nicht vars in Ihrem javacdebuglevel Argument des Ziels. Das folgende Ziel wird den Fehler verursachen.

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

Ändern Sie es an:

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

Dies ist wahrscheinlich ein JMockit Bug ist - sehr subtil und annyoing zu erfahren.

+0

Es hat funktioniert! Du bist ein Lebensretter! Das war etwas, das ich als "unfixierbar" aufgegeben hatte :) –

0

Ich habe diese Frage heute nur gesehen, aber wenn Sie können, senden Sie mir einige Tests, die den ClassFormatError beim Ausführen mit EMMA werfen, und ich werde versuchen, den Fehler in JMockit zu finden.

Haben Sie übrigens versucht, JMockit Coverage zu verwenden? Fügen Sie einfach jmockit-coverage.jar zum Klassenpfad hinzu und sehen Sie, was Sie bekommen. Normalerweise erzeugt dies (ohne zusätzliche Konfiguration) einen netten HTML-Coverage-Bericht im "coverage-report" -Dir unter dem Arbeitsverzeichnis. Einfacher geht es nicht!

+0

Danke für das Angebot, aber dieses Problem war auf einem Projekt bei der Arbeit, und ich denke nicht, dass meine Firma mit mir zufrieden sein würde, Ihnen Teile der Quelle zu schicken. Wenn ich einen Beispieltest machen kann, der das Problem aufweist, werde ich es Ihnen mitteilen. Ich habe JMockit Coverage nicht versucht. Ich werde das überprüfen! Der Hauptgrund, warum ich EMMA verwende, ist, dass es gute Plugins für Eclipse und Hudson hat. –

+0

Hey Rogerio, lass mich sehen, ob ich dir eine repräsentative Klasse bringen kann, um das zu wiederholen. –

0

Mein Team hatte das gleiche Problem. Der konkrete Fall war: Verwenden von jMockit, um statische Methoden einer Klasse in einer Unit-Test-Suite zu simulieren, die unter TeamCity mit EMMA als Coverage-Tool ausgeführt wurde. Die Lösung war die folgende:

hinzufügen tear-down-Methode zu jedem Test der statischen Methoden verspottet:

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

aktualisiert JMockit von 1,5 auf jede aktuelle Version.