2016-02-09 71 views
5

Pracuję nad uzyskaniem 100% pokrycia kodu dla biblioteki, nad którą pracuję i wydaje mi się, że mam pewne problemy z instrukcją przełączania i zasięgiem, którego po prostu nie rozumiem.Pokrycie Jacoco dla oświadczenia przełącznika

Obecnie używam Jacoco 0.7.2, ponieważ każda nowsza wersja wydaje się zrywać z Robolectrics.

przetestować prosty switch:

public enum Type { 
    NONE, LEGACY, AKS 
} 

private static Class<?> getCipherClass(Type type) { 
    switch (type) { 
     case LEGACY: 
      return CipherWrapperLegacy.class; 
     case AKS: 
      return CipherWrapperAks.class; 
     default: 
      return null; 
    } 
} 

Test pisałem zawiera następujące kontrole (muszę użyć refleksji jako metoda jest prywatny):

final CipherWrapper instance = CipherWrapper.createInstance(mockContext, CipherWrapper.Type.LEGACY, ALIAS); 
assertNotNull(instance); 

Method getCipherMethod = TestUtils.makeMethodAccessible(CipherWrapper.class, "getCipherClass", CipherWrapper.Type.class); 
assertNull(getCipherMethod.invoke(instance, CipherWrapper.Type.NONE)); 
assertEquals(CipherWrapperAks.class, getCipherMethod.invoke(instance, CipherWrapper.Type.AKS)); 
assertEquals(CipherWrapperLegacy.class, getCipherMethod.invoke(instance, CipherWrapper.Type.LEGACY)); 

Wynik nie jest co oczekiwać I:

Jacoco code coverage result

Obraz jest nieco mylący, ponieważ żółta linia sugeruje, że czegoś brakuje. Zielona ikona informuje mnie, że obejmuje 3 z 3 gałęzi.

Testowałem również, aby rozszerzyć obudowę przełącznika o case NONE i przewrócić, ale nic to nie zmieniło.

Jedyne, co mogę zrobić, to wymienić przełącznik na "/ else", a następnie otrzymam 100% pokrycia.

Obecnie mam pokrycie 98%, ale ja nic nie brakowało w oparciu o przegląd: Jacoco overall coverage

+5

Nie testujesz sprawy, kiedy przechodzisz 'null', po pierwsze ... –

+3

Brakuje jednego przypadku testowego, który przekazuje wartość pustą dla' type', co powinno skutkować ' NullPointerException'. (Szczerze mówiąc, przestaję rozciągać przed uderzeniem w wejście, a jonskeet wpada w ten sam punkt ...) –

+0

Hm ... prawda, ale dlaczego nie jest gdzieś wymieniona jako gałąź? Przegląd pokazuje, że nie brakuje mi żadnej złożoności, co zwykle ma miejsce, gdy brakuje mi ścieżki zerowej ... w każdym razie przetestuję ją i wrócę z wynikami – WarrenFaith

Odpowiedz

1

Jeśli metoda invoke nie podoba Ci się umieszczenie w zmiennej anonimowego:

getCipherMethod.invoke(instance, (CipherWrapper.Type) null); 

Następnie spróbuj to z nazwaną zmienną:

CipherWrapper.Type nullType = null; 
getCipherMethod.invoke(instance, nullType); 

Należy również sprawdzić, czy wyjątek wywołania jest po prostu opakowaniem wyjątku spowodowanego fakturowaniem króla metody, a nie błąd z samego wywołania.

+0

Rzeczywiście, wydaje się, że 'invoke()' tworzy nowy wyjątek i ma oryginalny, w moim przypadku oczekiwany, wyjątek NullPointerException jako "przyczynę". Mój blok catch wygląda następująco: catch (InvocationTargetException e) {if (e.getCause() instanceof NullPointerException) {....}} ' – WarrenFaith