Wie zum abfangen von SLF4J (mit logback logging über einen JUnit-test?
Ist es möglich, irgendwie abzufangen, die die Protokollierung (SLF4J + logback) und eine InputStream
(oder etwas anderes, das ist lesbar) über einen JUnit Testfall...?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen eine benutzerdefinierte appender
und konfigurieren logback-test.xml um es zu verwenden. Jetzt können wir überprüfen, Protokollierung von Ereignissen aus unserem test:
ILoggingEvent
stattLoggingEvent
. Das ist was für mich gearbeitet.events
nach jeder Testausführung.sample0.xml
. Vergessen Sie nicht, ändern Sie den appender auf Ihren EinbauDie Slf4j-API nicht so, aber Logback bietet eine einfache Lösung.
Können Sie
ListAppender
: ein whitebox-logback Appen, wo die log-Einträge werden in einerpublic List
Bereich, die wir nutzen könnten, um unsere Behauptungen.Hier ist ein einfaches Beispiel.
Klasse "Foo":
FooTest Klasse :
Können Sie auch verwenden, Matcher/assertion-Bibliotheken als AssertJ oder Hamcrest.
Mit AssertJ wäre es :
Logger fooLogger = (Logger) LoggerFactory.getLogger(Foo.class);
. Ich bin mitLoggerFactory
vonorg.slf4j.LoggerFactory
undLogger
vonch.qos.logback.classic.Logger
org.junit.platform.commons.logging.LoggerFactory
, das ist, was mir passiert ist.Können Sie slf4j-test von http://projects.lidalia.org.uk/slf4j-test/.
Es ersetzt die gesamte slf4j logback Umsetzung durch den eigenen, slf4j-api-Implementierung für tests und stellt eine api zur Geltendmachung gegen die Protokollierung von Ereignissen.
Beispiel:
slf4j-test
- Paket finden Sie hier: github.com/jaegertracing/jaeger-client-java/pull/378/filesObwohl das erstellen einer benutzerdefinierten logback Appen ist eine gute Lösung, es ist nur der erste Schritt, Sie werden schließlich am Ende der Entwicklung/neu erfinden slf4j-test, und wenn Sie ein bisschen weiter gehen: spf4j-slf4j-test oder anderen frameworks, die ich nicht kenne noch.
Werden Sie schließlich Gedanken darüber, wie viele Veranstaltungen Sie im Gedächtnis behalten, scheitern, unit-tests, wenn ein Fehler protokolliert wird (und nicht behauptet), machen Sie debug-Protokolle zur Verfügung, die auf test-Fehler, etc...
Disclaimer: ich bin der Autor von spf4j-slf4j-test, schrieb ich dieses backend zu können, besser zu testen spf4j, das ist ein guter Ort, um zu schauen, für Beispiele, wie man spf4j-slf4j-test. Einer der wichtigsten Vorteile, die ich erreicht war, wodurch meine build output (das ist begrenzt mit Travis), während immer noch mit all den Details, die ich brauche, wenn Fehler passiert.
Hatte ich Probleme beim testen von Protokollen Zeile wie: LOGGER.error(message, exception).
Die beschriebene Lösung in http://projects.lidalia.org.uk/slf4j-test/ versucht zu behaupten, als auch auf die Ausnahme, und es ist nicht einfach (und meiner Meinung nach wertlos) wieder den stacktrace.
Ich auf diese Weise behoben:
Dies hat auch den Vorteil, nicht abhängig Hamcrest Matcher Bibliothek.
Würde ich empfehlen, eine einfache, wiederverwendbare spy-Implementierung enthalten sein können in einem test wie JUnit Regel:
In Ihrem test, würden Sie aktivieren den Spion in der folgenden Weise:
Call
log.getEvents()
(oder andere, benutzerdefinierte Methoden) zum überprüfen der protokollierten Ereignisse.Einer einfachen Lösung werden könnte, zum Hohn der appender mit Mockito (zum Beispiel)
MyClass.java
MyClassTest.java
HINWEIS: ich bin mit der Behauptung eher als die Rückkehr
false
als den code und (mögliche) Fehler leichter zu Lesen, aber es wird nicht funktionieren, wenn Sie mehrere Prüfungen. In diesem Fall müssen Sie die return boolean der angibt, ob der Wert wie erwartet.