Exklusive synthetische Klassen in Emma innerhalb von STS

8

Wenn ich versuche, Coverage als oder maven build mit emma: emma auszuführen, bekomme ich Folgendes:

  

java.lang.IllegalStateException: Zugriff auf Methode nicht möglich: Kann nicht festgelegt werden   static final [Z-Feld packageName.ClassName. $ jacocoData zu [Z

Also habe ich online gesucht und auf der EclEmma-Website Folgendes gefunden:

  

Mein Code verwendet Reflektion. Warum schlägt es bei der Ausführung mit JaCoCo fehl?

     

Um Ausführungsdaten zu sammeln, instrumentiert JaCoCo die zu testenden Klassen   Das fügt zwei Klassen zu den Klassen hinzu: Ein privates statisches Feld   $ jacocoData und eine private statische Methode $ jacocoInit (). Beide Mitglieder   sind als synthetisch gekennzeichnet.

     

Bitte ändern Sie Ihren Code, um synthetische Mitglieder zu ignorieren. Das ist gut   Wie auch immer der Java-Compiler synthetische Mitglieder erstellt   in bestimmten Situationen.

Aber ich kann im Internet keine Dokumentation darüber finden, wie synthetische Mitglieder mit Emma ignoriert werden können.

In STS schaue ich unter Preferences / Java / Code Coverage und ich sehe ein Excludes-Feld, um Ausschlüsse zu setzen (und ich weiß, dass ich den Ausschluss auch in mein POM einfügen könnte).

Ich frage mich nur, was da drin gehen muss, um alle synthetischen Klassen auszuschließen.

Danke

    
bhcmoney 15.07.2013, 15:41
quelle

1 Antwort

9

Ich bin kürzlich auf dieses Problem mit einem generischen CSV-Export-Helfer gestoßen, den ich benutzt habe. Die Ausnahme, die Sie sehen, ist, dass Jacoco / Emma das synthetische Feld, das es verwendet, um Ihre Codeabdeckung zu verfolgen, nicht festlegen kann. Sie müssen Emma erlauben, auf dieses synthetische Feld zuzugreifen.

Wenn Sie den Zugriff von Emma auf synthetische Felder gestoppt haben, weil das Hinzufügen des synthetischen Feldes Probleme bei Ihrer Reflexion verursacht hat, z. Sie verwenden Reflektion, um über eine Sammlung von Field -Objekten zu iterieren, tun Sie einfach Folgendes:

%Vor%

Damit können Sie synthetische Felder, von denen Ihre Anwendung eigentlich nichts wissen sollte, von den Feldern trennen, die Sie in Ihren Klassen deklariert haben. Ich weiß, dass es ein bisschen hacky aussieht, aber es ist die eleganteste Lösung, die ich mir vorstellen kann. Emma benötigt dieses Feld, um Ihren Code zu instrumentieren. Das Beste, was Sie tun können, ist sicherzustellen, dass Ihr Code nicht mit dieser synthetischen Variable verwechselt wird.

    
JamesENL 12.03.2015 08:43
quelle