2011-01-10 18 views
20

Sto usando slf4j e voglio testare il mio codice unitario per assicurarmi che i messaggi di avviso/errore vengano generati in determinate condizioni. Preferirei che si tratti di test unitari rigorosi, quindi preferirei non dover richiamare la configurazione della registrazione da un file per verificare che i messaggi di log siano generati. Il quadro di derisione che sto usando è Mockito.Qual è il modo migliore per testare unitamente i messaggi di registro SLF4J?

+0

Poiché SLF4J è solo una "facciata" per altre implementazioni di registrazione, non è possibile testare l'unità da solo, è inoltre necessario specificare l'implementazione che si sta utilizzando. – darioo

+1

@darioo - Non vero. Potrei aggiungere un setter alla mia classe per passare il logger dal test, quindi passare un'istanza di Logger derisa e verificare che siano state effettuate le chiamate di registro appropriate. Speravo solo di ottenere una soluzione più elegante rispetto all'aggiunta di un metodo set solo per testare e rendere l'istanza di Logger non definitiva. –

+0

Per inciso, il libro "Growing Object Oriented Software" in generale ha un capitolo sui test unitari del logging. Non è del tutto convincente, ma è certamente ben congegnato e vale la pena leggerlo (http://www.amazon.co.uk/Growing-Object-Oriented-Software-Guided-Signature/dp/0321503627/ref=sr_1_1 ? ie = UTF8 & s = books & qid = 1294688741 & sr = 8-1) – skaffman

risposta

9

Penso che potresti risolvere il tuo problema con un appender personalizzato. Crea un appender di test che implementa lo org.apache.log4j.Appender e imposta l'appender nel log4j.properties e caricalo quando esegui i test case.

Se si chiama di nuovo al test harness da quella appender è possibile controllare i messaggi registrati

+3

Sarebbe molto apprezzato se è possibile offrire alcuni esempi di codice. – kenshinji

+0

@kenshinji Un esempio è fornito qui: https://stackoverflow.com/a/1828268/2521769 –

1

Invece di prendere in giro SLF4J, è possibile inserire le chiamate di registrazione importanti che è necessario per testare i propri metodi che è possibile prendere in giro più facilmente.

Se si vuole veramente prendere in giro SLF4J, scommetterei che si potrebbe creare il proprio provider per questo che ti consentirebbe di fornire un logger finto dal lato SLF4J invece di iniettarne uno nei tuoi oggetti di servizio.

0

Simile a @Zsolt, si può prendere in giro log4j Appender e impostarlo sulla Logger, quindi verificare le chiamate a Appender.doAppend(). Questo ti permette di testare senza dover modificare il codice reale.

10

Per testare slf4j senza fare affidamento su un'implementazione specifica (come log4j), è possibile fornire la propria implementazione di registrazione slf4j come descritto in this SLF4J FAQ. L'implementazione può registrare i messaggi che sono stati registrati e quindi essere interrogati dai test dell'unità per la convalida.

Il pacchetto slf4j-test fa esattamente questo. È un'implementazione di registrazione slf4j in memoria che fornisce metodi per il recupero dei messaggi registrati.

5

Un'implementazione test migliore di SLF4J che funziona davvero bene in un ambiente con l'esecuzione di test simultaneo è https://github.com/portingle/slf4jtesting

ho è intervenuto su alcuni discussione sui test log slf4j e le limitazioni di prova esistenti approcci quando si tratta all'esecuzione simultanea del test.

Ho deciso di mettere le mie parole in codice e quel git repo è il risultato.

+0

Speriamo che presto una terza risposta apparirà da qualcuno che ha un'implementazione di test ancora migliore di SLF4j ....;) – Adam

Problemi correlati