2013-07-15 11 views
8

Kiedy próbuje uruchomić Coverage jako lub uruchomić kompilacji maven użyciu Emma Emma pojawia się następujący:Wyłączając syntetyczne Zajęcia w ciągu Emma STS

java.lang.IllegalStateException: nie można uzyskać dostępu do metody: Nie można ustawić . static final packageName.ClassName pole [z $ jacocoData do [z

Więc szukałem wokół online i znalazłem następujące na stronie EclEmma:

Mój kod wykorzystuje odbicie. Dlaczego kończy się niepowodzeniem, gdy wykonuję go za pomocą JaCoCo?

Aby zebrać dane Instrumenty JaCoCo wykonanie klas badanego który dodaje dwa członków do klasy: prywatna pola static $ jacocoData i prywatny statyczna metoda $ jacocoInit(). Obaj członkowie są oznaczani jako syntetyczne.

Proszę zmienić kod, aby zignorować członków syntetycznych. Jest to dobra praktyka, tak jak i kompilator Java tworzy w pewnych sytuacjach członków syntezatora .

Ale nie mogę znaleźć żadnej dokumentacji w Internecie na temat tego, jak zignorować syntetycznych członków z Emmą.

W STS patrzę pod Preferencje/Java/Code Coverage i widzę pole Excludes, aby umieścić wykluczenia (i wiem, że mogę również umieścić wykluczenie w moim POM).

Zastanawiam się tylko, co trzeba tam zrobić, aby wykluczyć wszystkie syntetyczne klasy.

Dzięki

+0

"Hacky" sposób ignorowania '$ jacocoData' jest wiedzieć, że jest zawsze dołączany na końcu listy członków klasy. Chociaż bardzo chcielibyśmy wiedzieć, jak wykluczyć dowolnego syntetycznego członka klasy Java/Scala. –

+0

Masz szczęście? Natknąłem się na ten sam problem i teraz szukam, jak _zmianować twój kod, aby zignorować członków syntetycznych_. – topr

Odpowiedz

9

Niedawno wpadłem na ten problem z rodzajowego CSV pomocnika eksportowej że używam. Wyjątkiem jest to, że Jacoco/Emma nie może ustawić pola syntetycznego, którego używa do śledzenia zasięgu kodu. Musisz pozwolić Emmie na dostęp do tego syntetycznego pola.

Jeśli zatrzymałeś Emmę w dostępie do syntetycznych pól, ponieważ dodanie pola syntetycznego powodowało problemy z twoim odbiciem, np. używasz refleksji iteracyjne nad zbiór Field przedmiotów, po prostu wykonaj następujące czynności:

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. 
    } 
} 

Powyższe pozwala na oddzielenie pola syntetycznych, których aplikacja nie powinna naprawdę wiedzą nic na temat, od pól zadeklarowałeś na swoich zajęciach. Wiem, że wydaje się trochę odurzająca, ale to najbardziej eleganckie rozwiązanie, jakie mogłem wymyślić. Emma potrzebuje tego pola, aby móc zaprogramować swój kod, najlepszą rzeczą, jaką możesz zrobić, to upewnić się, że twój kod nie zepsuł się z tą syntetyczną zmienną.

Powiązane problemy