2016-02-09 34 views
5

Sto lavorando per ottenere una copertura del codice al 100% per una libreria su cui sto lavorando e mi sembra di avere alcuni problemi con un'istruzione switch e la copertura che semplicemente non capisco.Copertura jacoco per la dichiarazione dell'interruttore

Attualmente sto usando Jacoco 0.7.2 perché ogni versione più recente sembra rompersi con Robolectrics.

provo una semplice istruzione 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; 
    } 
} 

Il test che ho scritto contiene i seguenti controlli (devo usare riflessione come il metodo è privato):

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)); 

Il risultato non è quello che mi aspettavo:

Jacoco code coverage result

L'immagine è un po 'confusa poiché la linea gialla indica che manca qualcosa. L'icona verde mi dice che 3 di 3 rami sono coperti.

Ho anche provato a estendere la scatola degli interruttori con case NONE e una caduta, ma non ha cambiato nulla.

L'unica cosa che posso fare è sostituire l'interruttore con if/else e quindi ottengo una copertura del 100%.

Attualmente ho una copertura del 98%, ma ho nulla è perso basa sulla panoramica: Jacoco overall coverage

+5

Non si verifica il caso quando si passa in 'null', per una cosa ... –

+3

C'è un caso di test mancante, che sta passando in un valore nullo per' tipo', che dovrebbe risultare in un ' NullPointerException'. (Onestamente, mi fermo per allungare prima di entrare, e jonskeet piomba in avanti con lo stesso punto ...) –

+0

Hm ... vero, ma perché non è menzionato come un ramo da qualche parte? La panoramica mostra che non mi manca nessuna complessità, che è normalmente il caso se mi manca un percorso nullo ... comunque lo testò e tornerò con i risultati – WarrenFaith

risposta

1

Se il metodo invoke non ti piace mettere in una variabile anonima:

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

Poi prova con una variabile denominata:

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

Inoltre, si dovrebbe verificare se l'eccezione invocazione è solo avvolgendo un'eccezione causata da invo re il metodo piuttosto che un errore con l'invocazione stessa.

+0

In effetti, sembra che 'invoke()' crei una nuova eccezione e abbia l'originale, nel mio caso previsto, NullPointerException come "causa". Il mio blocco di cattura ha il seguente aspetto: 'catch (InvocationTargetException e) {if (e.getCause() instanceof NullPointerException) {....}}' – WarrenFaith