2010-12-22 17 views
40

Używam EclEmma, ​​wtyczki Emma do Eclipse, a raport o pokryciu pokazuje tylko częściowy zasięg dla zdefiniowanej przeze mnie Enum, mimo że pokazuje jedyną wartość w Enum jako pokryta. Zakładam, że istnieje luka w zakresie zasięgu dla domniemanych metod, które powracają do Enum, ale nie jestem do końca pewien.Zasięg Emmy w typach Enum

Na przykład, z tym Enum, EclEmma podkreśla wszystko na zielono, z wyjątkiem deklaracji pakietu:

package com.blah; 

public enum UserRole { 
HAS_ACCESS 
} 

Gdybym podciągnąć szczegóły pokrycia dla klasy, widzę to:

alt text

Moje pytanie brzmi: jaki jest najlepszy sposób uzyskania 100% pokrycia na moich zajęciach z programu Enum przy użyciu EclEmma?

+0

Czy Emma nie podaje szczegółowych informacji o tym, co przegapiłeś? Wydaje się to trochę dziwne. –

+0

Moje 2 centy, jak byłem tam wcześniej i widziałem, jak moi programiści wpadli w tę pułapkę. Wygląda na to, że jesteś bardziej namiętny (niż pożądany) po osiągnięciu 100% zasięgu kodu. To tylko strata czasu. Raporty narzędzi pokrycia powinny być używane jedynie w celu zidentyfikowania możliwości poprawy kodu (lub zmniejszenia zakresu technicznego) i nie powinny być postrzegane jako MUSISZ naprawić. –

+0

Zgadzam się, ale jeśli istnieje prosty sposób uzyskania zasięgu, nie zamierzam tego zignorować. W raporcie o zasięgu jest hałas, którego nie powinienem filtrować, aby uzyskać prawdziwe problemy. Rozumiem, że nie ma żadnych ostrzeżeń kompilatora. Nie * mam * naprawić wszystkie, ale nie chcę filtrować tych mniej ważnych, aby zobaczyć, że mam nowy, który jest bardzo ważny. BTW, twoja odpowiedź nie jest odpowiedzią i byłaby lepiej umieszczona jako komentarz. –

Odpowiedz

51

To, co widzisz, to jakiś ukryty kod bajtowy generowany z powodu wyliczenia.

Aby pozbyć się tego problemu, dodaj wywołanie metod wartości() i valueOf() w wyliczeniu, o czym wspominali wcześniej Carl Manaster i Peter Lawrey.

+11

Stwierdziłem, że jedyne, co muszę zrobić, to wykonać jedno połączenie z ValueOf i uzyskać 100% pokrycia. Myślałem, że będę musiał zrobić więcej. –

+0

Miałem do czynienia z tym samym problemem z 'enum' i' classes'. Byłem w stanie rozwiązać z przypadkiem 'wyliczenia'. Ale mój zasięg kodu nie obejmuje nazwy "pakietu". każda sugestia byłaby pomocna. – Amolb

+0

@Amolb Twój najlepszy zakład to zadać nowe pytanie ze wszystkimi istotnymi szczegółami. Ten był wyraźnie o 'enum's, a nie' package's. – deterb

2

Wystąpił podobny problem, w którym kompilator generował metody na wyliczeniach, takich jak wartości(), zazwyczaj nie były wywoływane w naszym kodzie testowym. Rozwiązaliśmy problem, filtrując liczby naszych obiektów wyliczeniowych z naszego raportu końcowego.

Dlatego nie lubię używać zasięgu kodu jako miary kompletności. Kiedy myślę o lepszym metrum, dam ci znać. :)

+3

Riffing off: być może mógłbyś napisać ogólną metodę testową, która pobiera dowolne wyliczenie i wykonuje swoje wrodzone metody, aby pozbyć się hałasu z raportu z testów. To trochę ryzykowne - jeśli zrobiłbyś to ze wszystkim, miałbyś 100% pokrycia testowego i żadnej wartości testowej - ale myślę, że to mogłoby zaspokoić twoje potrzeby. –

+2

Możesz dodać ogólny ćwiczący enum, który wywołuje wartości() i valueOf(), które możesz wywołać za pomocą ćwiczeniaEnum (MyEnum.class) –

+1

Dzięki za informację zwrotną. Masz rację co do przyczyny luki w zakresie zasięgu, ale nie sądzę, że ignorowanie Enums z raportu dotyczącego zasięgu jest właściwą drogą. –

9

Zgadzam się z innymi plakatami, że 100% zasięgu kodu może być błędne. Ale muszę przyznać, że satysfakcja z otrzymania 100% pokrycia z nowo napisanego kodu źródłowego.

Na szczęście, ponieważ wszystkie wyliczenia rozszerzają tę samą "klasę", można osiągnąć 100% z niewielką pomocą od refleksji przyjaciela.

Wystarczy dodać następującą metodę statyczną, aby testerzy zadzwonili, używając [EnumTypeName] .class jako parametru.

public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) { 
    try { 
     for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) { 
     enumClass.getMethod("valueOf", String.class).invoke(null, o.toString()); 
     } 
    } 
    catch (Throwable e) { 
     throw new RuntimeException(e); 
    } 
    } 

Zakładając tę ​​funkcję statycznego realizowany był w klasie o nazwie „Wspólna”, będzie trzeba tylko włączyć tę linię dla każdego ENUM:

Shared.superficialEnumCodeCoverage(UserRole.class); 

Kluczowym słowem jest „powierzchowne”.

+5

Odbicie to najgorszy rodzaj przyjaciela. Backstabber. –

+2

Działa to tylko wtedy, gdy metoda 'toString' nie zostanie nadpisana w klasie wyliczeniowej. W takim przypadku będziesz musiał zamiast tego wywołać '.name' (co powoduje, że musisz mieć' o' typu wyliczeniowego (lub przynajmniej typu 'Enum '). –

+0

jeśli wyliczenie nie ma żadnych pól , zakres jest nadal niekompletny – datahaki