これらの(驚くべきことに)迅速で役立つ回答に感謝します。彼らは私の解決策のために私を正しい道に導いてくれました。
コードベースは私がこれを使いたいと思っていて、そのロガーメカニズムとしてjava.util.loggingを使用していますが、log4jまたはロガーインターフェイス/ファサードに完全に変更するのに十分なほどこれらのコードに慣れていません。しかし、これらの提案に基づいて、私はjulhandler拡張機能を「ハックアップ」し、それは御馳走として機能します。
簡単な要約を次に示します。拡張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(){}
}
明らかに、あなたは好きなだけ/欲しい/必要なだけ保存するLogRecord
か、オーバーフローが発生するまでそれらをすべてスタックにプッシュすることができます。
junit-testの準備では、を作成しjava.util.logging.Logger
、それにそのような新しい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);
の呼び出しsetUseParentHandlers()
は、通常のハンドラーを無音にすることです。これにより、(このjunit-testの実行では)不要なログが発生しなくなります。テスト対象のコードがこのロガーを使用するために必要なことは何でも行い、テストを実行してassertEqualityを実行します。
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(もちろん、この作業の大部分を@Before
メソッドに移し、その他のさまざまな改善を行うことになりますが、それではこのプレゼンテーションが煩雑になります。)