Vielen Dank für diese (überraschend) schnellen und hilfreichen Antworten. Sie haben mich auf den richtigen Weg für meine Lösung gebracht.
Die Codebasis, in der ich dies verwenden möchte, verwendet java.util.logging als Protokollierungsmechanismus, und ich fühle mich in diesen Codes nicht zu Hause genug, um dies vollständig in log4j oder in Protokollierungsschnittstellen / -fassaden zu ändern. Aber basierend auf diesen Vorschlägen habe ich eine Julhandler-Erweiterung "gehackt", und das ist ein Vergnügen.
Es folgt eine kurze Zusammenfassung. Erweitern java.util.logging.Handler
:
class LogHandler extends Handler
{
Level lastLevel = Level.FINEST;
public Level checkLevel() {
return lastLevel;
}
public void publish(LogRecord record) {
lastLevel = record.getLevel();
}
public void close(){}
public void flush(){}
}
Natürlich können Sie so viel speichern, wie Sie möchten / wollen / brauchen LogRecord
, oder sie alle in einen Stapel schieben, bis Sie einen Überlauf erhalten.
In Vorbereitung auf den Junit-Test erstellen Sie einen java.util.logging.Logger
und fügen einen solchen hinzu LogHandler
:
@Test tester() {
Logger logger = Logger.getLogger("my junit-test logger");
LogHandler handler = new LogHandler();
handler.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
Der Aufruf von setUseParentHandlers()
besteht darin, die normalen Handler zum Schweigen zu bringen, damit (für diesen Junit-Testlauf) keine unnötige Protokollierung erfolgt. Tun Sie alles, was Ihr zu testender Code benötigt, um diesen Logger zu verwenden, führen Sie den Test und assertEquality aus:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Natürlich würden Sie einen großen Teil dieser Arbeit in eine @Before
Methode verschieben und verschiedene andere Verbesserungen vornehmen, aber das würde diese Präsentation überladen.)
logger.getAllAppenders()
, dann durchzugehen undappender.setThreshold(Level.OFF)
jeden anzurufen (und sie zurückzusetzen, wenn Sie fertig sind!). Dies stellt sicher, dass die "schlechten" Nachrichten, die Sie generieren möchten, nicht in den Testprotokollen angezeigt werden und den nächsten Entwickler ausflippen.