これらの(驚くほど)迅速で役立つ回答に感謝します。彼らは私を私の解決策のための正しい方法に置きました。
コードベースは私がこれを使用したかった、ロガーメカニズムとして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の準備では、aを作成し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
メソッドに移動して、他のさまざまな改良を加えますが、それではこのプレゼンテーションが乱雑になります。)
logger.getAllAppenders()
、次にステップスルーしappender.setThreshold(Level.OFF)
てそれぞれを呼び出すことです(そして、完了したらリセットします)。これにより、生成しようとしている「悪い」メッセージがテストログに表示されず、次の開発者をびっくりさせることがなくなります。