2013-07-15 8 views
8

Ohne Beim Versuch Coverage wie oder führen ein Maven-Build mit emma auszuführen: emma ich folgenden erhalten:Synthetische Klassen in Emma innerhalb STS

java.lang.IllegalStateException: Kann nicht Methode zugreifen: nicht einstellen . static final [Z Feld packageName.className $ jacocoData bis [Z

Also suchte ich im Internet um, und ich fand die folgenden auf der EclEmma Webseite:

Mein Code verwendet Reflexion. Warum schlägt es fehl, wenn ich es mit JaCoCo ausführe? Ein privates statisches Feld $ jacocoData und ein privater statischer Methode $ jacocoInit():

Um Ausführungsdaten JaCoCo Instrumente, um die Klassen zu prüfenden , das fügt zwei Mitglieder in den Klassen zu sammeln. Beide Mitglieder sind als synthetische markiert.

Bitte ändern Sie Ihren Code, um synthetische Mitglieder zu ignorieren. Dies ist eine gute Praxis sowieso, da auch der Java-Compiler synthetische Mitglieder in bestimmten Situationen erstellt.

Aber ich kann keine Dokumentation im Web finden, wie synthetische Mitglieder mit Emma ignoriert werden können.

In STS schaue ich unter Preferences/Java/Code Coverage und ich sehe ein Excluds-Box, um Ausschlüsse zu setzen (und ich weiß, ich könnte auch den Ausschluss in meinem POM).

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

Dank

+0

Der 'hacky' Weg, die '$ jacocoData' zu ignorieren, ist zu wissen, dass sie immer am Ende der Liste der Klassenmitglieder angehängt wird. Allerdings wäre es für uns sehr interessant zu wissen, wie man synthetische Mitglieder einer Java/Scala Klasse ausschließt. –

+0

Irgendwas Glück damit? Ich bin auf das gleiche Problem gestoßen und nun suche ich, wie ich Ihren Code ändern kann, um synthetische Mitglieder zu ignorieren. – topr

Antwort

9

ich vor kurzem lief in diese Frage mit einem generischen Helfer CSV-Exports, die ich benutze. 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 Emma den Zugriff auf synthetische Felder gestoppt haben, weil das Hinzufügen des synthetischen Felds Probleme mit Ihrer Reflektion verursachte, z. Sie verwenden Reflexion eine Sammlung von Field Objekte iterieren, die nur auf folgende Arten tun:

Field[] fields = fooObject.getClass().getDeclaredFields(); 
Field[] nonSyntheticFields = new Field[fields.length]; 

for(int i = 0; i < fields.length; i++){   
    if(!fields[i].isSynthetic()){ 
     nonSyntheticFields[i] = fields[i]; 
     //Or whatever processing you are doing here with your fields. 
    } 
} 

Die obige Sie synthetische Felder trennen können, die Ihre Anwendung nicht wirklich etwas über, aus den Bereichen sollten wissen, dass Sie haben Ihre Klassen angemeldet. 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.