Domanda

Sto usando il plug-in Maven (2) Cobertura per creare report sulla copertura del codice e ho il seguente stub che sto usando in un metodo:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
}
System.err.println("The program never exited!");

So che devo registrare l'eccezione, ecc., ma non è questo il punto in questo momento ... Cobertura si rifiuta di riconoscere che la linea dopo la stampa della traccia dello stack è coperta. Ossia, la riga con '}' prima dell'istruzione System.err.println non viene mostrata come coperta. Prima, la parentesi graffa finale del metodo non veniva mostrata come coperta, quindi l'istruzione System.err . Hai idea di come posso convincere il plugin maven di cobertura che, dal momento che è coperta l'istruzione System.err.println , deve essere stato coperto quel controvento finale?

Oh sì, e uso un finto gestore della sicurezza per lanciare l'eccezione di sicurezza, poiché è il modo più semplice che ho trovato per far continuare l'esecuzione del test dopo la chiamata System.exit .

È stato utile?

Soluzione

Non uso Cobertura da un po '(2005?), e ho visto questo comportamento allora. Un problema simile esiste con NCover per C # e le parentesi graffe che seguono i blocchi catch / finally.

Il mio suggerimento sarebbe di aggiungere a questa segnalazione di bug di Cobertura dettagliare un problema simile . Inoltre, segui i consigli di @ tvanfosson e renditi conto di non avere una copertura su una parentesi graffa, che in realtà non diventa nulla nella JVM, è qualcosa che puoi ignorare come "rumore".

Altri suggerimenti

Vorrei esaminare il rapporto sulla copertura. Ricontrolla i miei test. Si noti che il codice è davvero coperto e non preoccuparti di colpire il 100%. La copertura del codice viene utilizzata al meglio per trovare aree che potresti aver trascurato di raggiungere con i tuoi test, ma concentrarsi solo sull'ottenere una copertura del 100% come obiettivo è una cattiva abitudine che può portarti a saltare i test che devono essere scritti solo perché il tuo strumento mostra 100%. Usa lo strumento per quello che può fare ma non cadere nella trappola di lasciare che lo strumento definisca ciò che fai.

Nel formato del file di classe Java ogni metodo è annotato con una tabella che mappa gli offset ai numeri di riga. In questo caso, il controvento di chiusura non produce alcun bytecode, quindi non è coperto. Questo è un problema di corrispondenza imperfetta tra sorgente e bytecode. Dovrebbe essere gestito dallo strumento di copertura, riconoscendo questa riga come non codice.

So che Emma ha problemi simili. Clover ha tariffe molto migliori, ma è commerciale (non sono sicuro se gestirà anche questo caso) . Se usi IDEA, dovresti provare la loro nuova implementazione della copertura - è abbastanza buono e in fase di sviluppo attivo.

So che questa è una vecchia domanda e che Cobertura lo ha già risolto, ma per completezza la copertura mancante su "} " è stato causato dall'interno automaticamente "finalmente" blocco.

Vedi il tuo codice così:

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
} finally {
    // noop
}

Fortunatamente questo non accade più per alcune versioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top