Domanda

Sto cercando di utilizzare EMMA per misurare la copertura di alcuni test JUnit che utilizzano JMockit.Ma quando provo a eseguire i test JMockit dopo aver utilizzato EMMA, circa un quarto dei test fallisce con il seguente errore:

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)

Non riesco a vedere alcuno schema su quali test falliscono e quali no.Immagino che questo sia solo un bug in JMockit, ma qualcuno conosce una soluzione alternativa?

Ho trovato una domanda molto simile chiamata "Ottenere ClassFormaterror con Emma?" Ma la soluzione non funziona per me (non sto usando alcun metodo RelenTant = True Mock).Altre idee?

Grazie in anticipo.

È stato utile?

Soluzione

Sono stato in esecuzione nello stesso problema - questo sembra essere fissato per me e, si spera aiuterà chiunque altro pure.

Se stai usando questo attraverso ant, assicurarsi che non si dispone di vars in argomento javac del bersaglio debuglevel. Il seguente obiettivo causerà l'errore.

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

modificarla in:

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

Questo è probabilmente un bug JMockit - molto sottile e annyoing per scoprire

.

Altri suggerimenti

Ho visto questa domanda solo oggi, ma se puoi, inviami alcuni test che generano il ClassFormatError durante l'esecuzione con EMMA e proverò a trovare il bug in JMockit.

A proposito, hai provato a utilizzare JMockit Coverage?Aggiungi semplicemente jmockit-coverage.jar al classpath e guarda cosa ottieni.In genere, questo produrrà (senza alcuna configurazione aggiuntiva) un bel rapporto di copertura HTML nella directory "report di copertura" sotto la directory di lavoro.Non può essere più facile di così!

La mia squadra ha avuto lo stesso problema. Il caso concreto era: usando JMockit per deridere i metodi statici da una classe in una suite di unità di test in esecuzione con TeamCity con EMMA come strumento di copertura. La soluzione è stata la seguente:

Aggiungere un metodo strappo a ciascun test che deriso metodi statici:

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

Aggiornamento JMockit da 1,5 a qualsiasi versione recente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top