Was ist der beste Weg, um unit-test SLF4J log-Meldungen?
Ich bin mit slf4j und ich will unit-test-meine-code, um sicherzustellen, dass warn/Fehler-log-Meldungen generiert werden, unter bestimmten Bedingungen. Ich würde eher diese strenge unit-tests, so dass ich lieber nicht haben, um ziehen Sie die Protokollierung Konfiguration aus einer Datei, um zu testen, ob die log-Meldungen generiert werden. Das mocking framework das ich verwende, ist Mockito.
Da SLF4J ist nur eine "Fassade" für die anderen logging-Implementierungen, Sie kann nicht unit-testen Sie es einfach selbst, Sie müssen auch angeben, die Implementierung, die Sie verwenden.
Nicht wahr. Ich könnte hinzufügen, ein setter zu meiner Klasse pass in den logger aus dem test, dann gehen in einen verspotteten aus Logger-Instanz, und stellen Sie sicher, dass das entsprechende Protokoll-Anrufe gemacht wurden. Ich habe nur gehofft, um eine elegantere Lösung, als das hinzufügen einer set-Methode nur zum testen und meine Logger-Instanz nicht rechtskräftig.
Als ein beiseite, die im Allgemeinen ausgezeichnete "Growing Object-Oriented Software" - Buch hat ein Kapitel über das unit-testing der Protokollierung. Es ist nicht völlig überzeugend, aber es ist sicherlich gut durchdacht und lesenswert (amazon.co.uk/Wachsen-objektorientierte-Software-Guided-Unterschrift/...)
Nicht wahr. Ich könnte hinzufügen, ein setter zu meiner Klasse pass in den logger aus dem test, dann gehen in einen verspotteten aus Logger-Instanz, und stellen Sie sicher, dass das entsprechende Protokoll-Anrufe gemacht wurden. Ich habe nur gehofft, um eine elegantere Lösung, als das hinzufügen einer set-Methode nur zum testen und meine Logger-Instanz nicht rechtskräftig.
Als ein beiseite, die im Allgemeinen ausgezeichnete "Growing Object-Oriented Software" - Buch hat ein Kapitel über das unit-testing der Protokollierung. Es ist nicht völlig überzeugend, aber es ist sicherlich gut durchdacht und lesenswert (amazon.co.uk/Wachsen-objektorientierte-Software-Guided-Unterschrift/...)
InformationsquelleAutor Javid Jamae | 2011-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie könnte lösen Ihr problem mit einer benutzerdefinierten Appen. Erstellen Sie einen test-appender, die sich um die
org.apache.log4j.Appender
, und setzen Sie Ihre appender in derlog4j.properties
und laden Sie es, wenn Sie ausführen von Testfällen.Wenn Sie rufen Sie zurück, um die Testumgebung aus, dass
appender
Sie können die ProtokollnachrichtenEin Beispiel ist hier gegeben: stackoverflow.com/a/1828268/2521769
aber es scheint, dass dieses Beispiel nicht funktioniert, slf4j!
InformationsquelleAutor Zsolt
Zur Prüfung slf4j, ohne sich auf eine bestimmte Implementierung (z.B. log4j), Sie können Ihre eigene slf4j logging-Implementierung, wie beschrieben in das SLF4J-FAQ. Ihre Implementierung kann die Aufzeichnung der Nachrichten, die angemeldet waren und dann abgefragt werden, indem Sie Ihre unit-tests für die Validierung.
Den slf4j-test Paket macht genau dies. Es ist eine in-memory-slf4j-logging-Implementierung, die Methoden für das abrufen von Nachrichten protokolliert.
slf4j-test
- Paket finden Sie hier: github.com/jaegertracing/jaeger-client-java/pull/378/files. Zugegeben, Ihre Dokumentation ist ganz wunderbar, wie gut.Diese funktioniert nicht mehr mit slf4j-api version 1.8 oder höher, weil: "die Planung für die Einführung von Jigsaw (Java-9), slf4j-api-version 1.8.x und später mit der ServiceLoader-Mechanismus. Frühere Versionen von SLF4J stützte sich auf die statische binder-Mechanismus ist nicht mehr geehrt durch die slf4j-api". (siehe slf4j.org/codes.html).
InformationsquelleAutor eakst7
Einen besseren test-Implementierung von SLF4J, dass funktioniert wirklich gut in einer Umgebung mit gleichzeitigen test-Ausführung ist https://github.com/portingle/slf4jtesting
Hab ich stimmte in ein paar Diskussion über slf4j anmelden, testen und die Grenzen der bestehenden Ansätze testen, wenn es um die gleichzeitige Ausführung test.
Beschloss ich, meine Worte in einen code verwandelt, das git repo ist das Ergebnis.
InformationsquelleAutor John Lonergan
Statt mocking SLF4J können Sie wichtige logging-Aufrufe, die Sie müssen zum testen in Ihren eigenen Methoden, die Sie können mock leichter.
Wenn Sie wirklich wollen, zu verspotten, SLF4J, würde ich Wette, Sie könnten Ihre eigenen Anbieter für Sie, die Ihnen erlauben würde, die Versorgung eines mock-logger aus dem SLF4J-Seite, anstatt der Injektion in Ihrem service-Objekte.
InformationsquelleAutor David Harkness
Erstellen Sie eine test-Regel:
Dann verwenden Sie es:
InformationsquelleAutor Andrew Feng
Ähnlich wie @Zsolt, können Sie mock log4j
Appender
und legen Sie es auf dieLogger
, dann überprüfen Sie, Anrufe zuAppender.doAppend()
. Dies ermöglicht es Ihnen zu testen, ohne änderung der realen code.InformationsquelleAutor Kevin Welker