2015-05-08 9 views
6

Ho una classe come segue:Come aggiungere variabili membro statiche Jacoco Test Coverage?

public class XConstants { 

    public static final int A_TYPE = 1; 
    public static final int B_TYPE = 2; 
} 

Sto usando entrambe le variabili nel mio test, ma quando esamino la copertura di test con Jacoco lo dimostra% 0 copertura di test per questa classe. La mia ipotesi è che è perché non istanziamo mai questa classe, basta usare le sue variabili statiche. Ho provato a creare un'istanza e la copertura del test è andata a 100%. Come posso superare questo problema?

risposta

5

JaCoCo misura la copertura del test in base alla percentuale di bytecode effettivamente eseguita. La dichiarazione della primitiva finale statica o della costante String non crea alcun bytecode da eseguire, è solo una voce all'interno del pool costante. L'unica bytecode che avete qui è un costruttore predefinito implicito, di solito in questo modo:

aload_0 
invokespecial Object.<init> 
return 

Così, quando non si chiama, devi 0%, quando si chiama esso, si ha il 100%.

Il mio suggerimento è di ignorare questo problema. Non dovresti cercare di ottenere una copertura del 100%, non importa cosa. Dopotutto non garantisce nulla: anche il codice coperto al 100% può contenere bug gravi.

+0

Grazie @Tagir che abbia un senso. Conosci qualche soluzione alternativa? Cosa succede se utilizzo Enum? –

+1

Aggiunto un suggerimento su cosa fare. –

1

Nel nostro progetto abbiamo superato problemi di nessuna copertura per la classe che contiene solo le costanti creando costruttore privato (seguente schema da java.lang.Math):

private XConstants {} 

e quindi utilizzando Trajano commons-testing libreria per affermare che questo costruttore è privato e invocare per soddisfare la copertura:

assertUtilityClassWellDefined(XConstants.class) 
2

Hai fatto una classe, che può essere istanziato, ma non avete mai un'istanza, quindi tecnicamente non copriva quel codice. La soluzione semplice per una "classe piena di costanti" è invece di renderla un'interfaccia. Si noti inoltre che le variabili in un'interfaccia sono pubblici, statici e finale per impostazione predefinita, in modo che il codice può semplicemente apparire come segue:

public interface XConstants { 
    int A_TYPE = 1; 
    int B_TYPE = 2; 
} 
+0

Facile ed efficace. :) Grazie! – Gorbag