2012-06-08 28 views
5

Ho appena scritto un semplice codice di esempio per assicurarmi di avere EclEmma installato correttamente. Non ricevo copertura al 100% e non capisco perché. L'evidenziazione implica che abbia a che fare con il nome della classe. Ecco il mio codice, con corrispondenti test JUnit, il modo in cui EclEmma evidenziato che:Un codice coperto può avere un indice di copertura EclEmma inferiore al 100%?

Arithmetic class

Tests for Arithmetic class

I risultati di copertura mostrano che tre istruzioni in Arithmetic non sono sempre successo, anche se entrambi i metodi attuali sembrano per essere completamente coperto:

Coverage information

ho letto the EclEmma documentation about basic block coverage, ma sono ancora confuso. Non sono sicuro di quali blocchi di base vengano ignorati. All'inizio pensavo che EclEmma potesse semplicemente ignorare il bytecode per le classi, ma il ArithmeticTest sembra essere gestito bene.

Ho due domande strettamente correlati:

  1. Questo indica un problema con il modo in cui ho installato/configurato EclEmma?
  2. È normale/accettabile che un codice completamente coperto abbia un livello di copertura EMMA alto ma non del 100% e, in caso affermativo, come funziona?

risposta

9

Il codice implica un costruttore di default, che non possono essere adeguatamente etichettato da Emma perché, non ha un blocco di testo

Poiché non è codificato correttamente nel blocco di testo, Emma non può associare la registrazione di copertura al file di testo e sembra che il codice non sia coperto; perché, è stato eseguito qualche bytecode, ma non è stato possibile registrare la registrazione della linea. Successivamente, quando l'elemento di reporting legge la registrazione di riga, non riesce a trovare i numeri di riga per il costruttore predefinito e mette in evidenza l'errore nell'unica posizione che ha senso, la riga di dichiarazione della classe.

Il costruttore di default sembra

public Arithmetic() { 
    super(); 
} 

Dove il super è la prima istruzione implicita che costruirà Object. Mentre puoi omettere la sua presenza, il compilatore lo aggiungerà per te. Ecco dove ottieni "3 linee" invece di una.

+0

In realtà, ha un "blocco di testo", è solo vuoto. In bytecode, il costruttore predefinito è lì, sulla linea segnata in rosso da Eclemma. Per coprirlo e farlo apparire in verde, un test deve solo chiamare il costruttore: 'new Arithmetic()'. Ovviamente, la cosa corretta qui sarebbe dichiarare un costruttore predefinito 'private' nella classe. –

2

IIRC, è necessario creare un'istanza della classe per esercitare il costruttore fornito in lingua.

4

penso vi sia bisogno di testare l'istanza di Arithmetic pure, o dichiarare il costruttore private per non consentire di un'istanza

+1

Ah, prova il costruttore lo fa. Eclemma non è più felice con un costruttore privato, ma penso di ricordare di aver visto una soluzione alternativa da qualche parte. – Pops