Perché non EclEmma coprire sincronizzato (MyClass.class)?
-
02-10-2019 - |
Domanda
Sto usando EclEmma per l'analisi di copertura.
Il mio codice Java include una sincronizzato blocco (MyClass.class) {}.
EclEmma dice che è solo parzialmente coperto, evento anche se ho un test di unità in cui un thread ottiene l'accesso e un altro thread è bloccato.
E 'possibile ottenere una copertura completa di usare sincronizzato EclEmma?
Posso annotare il codice in qualche modo per dire EclEmma per dare questa linea una copertura completa?
Cordiali saluti Roger
Soluzione
Non sono sicuro che sia possibile ottenere una copertura completa, dal momento che numero 2939804 rapporti :
EMMA sempre segni
synchronized(..)
come parzialmente coperta ??strong>Esempi:
synchronized (lock) // partially covered (yellow line in EclEmma)
{
// ...
}
synchronized (this) // partially covered (yellow line in EclEmma)
{
// ...
}
Forse uno strumento diverso ( come Cobertura ) produrrebbe un risultato diverso? (Non ho ancora testato di recente).
Aggiornamento dicembre 2012 (più di 2 anni più tardi):
synchronized
si illumina verde se il blocco sincronizzato contiene codice che attende su un monitor oggetto, e un interrupt di prova del filo attesa.Dopo un po 'di sperimentazione, sono stato in grado di ottenere una copertura completa della linea
synchronized
se il bloccosynchronized
completato normalmente e completato bruscamente a causa di un'eccezione.
Altri suggerimenti
EclEmma utilizza Jacoco sotto per l'analisi di copertura.
Come spiegato in (attualmente inesistente) Opzione Jacoco JAVAC.SYNC filtraggio , il comportamento è il risultato del codice byte generato per blocchi sincronizzati:
Un Java blocco sincronizzato viene compilato in due istruzioni bytecode:. MONITORENTER all'inizio e MONITOREXIT alla fine del blocco
Per garantire che il monitor viene rilasciato in ogni caso sia installato un gestore di eccezioni, che punti ad un'altra istruzione MONITOREXIT. Questo blocco del gestore di eccezione causa tipicamente copertura linea parziale che non ha senso dal punto di vista codice sorgente.
Una legato Jacoco questione 245 spiega come eccezioni possono essere attivati ??per raggiungere la piena copertura, ove auspicata, come spiegato anche da @ nathan-ryan:
- Un test che esegue il blocco sincronizzato normalmente
- Un secondo test che lancia (e quindi attende) un'eccezione all'interno del blocco sincronizzato.
Credo che il problema è MyClass.class
che a quanto pare è implementata utilizzando
http://emma.sourceforge.net/faq.html#q .fractional.examples
rami impliciti a causa di un Class.forName nascosta (). Questo caso è piuttosto sfortunato perché è abbastanza comune e tuttavia il programmatore non ha quasi alcun controllo su di esso.
A causa Class.forName () può lanciare eccezioni controllate, il compilatore emette un blocco catch che genera nuovamente loro come incontrollato. Questo blocco catch quasi mai eseguito in pratica, ma si riesce a marcatura linea parzialmente coperto.
ho perso che sulla prima lettura attraverso.
cercherò di ri-scrivere il mio codice per ottenere una copertura completa.
/ Roger