Bu (şaşırtıcı) hızlı ve yararlı cevaplar için çok teşekkürler; beni çözümüm için doğru yola koydular.
Ben kodbase bunu kullanmak istiyorum vardı, onun logger mekanizması olarak java.util.logging kullanır ve ben bu kodlarda tamamen log4j veya logger arabirimleri / cepheleri değiştirmek için yeterince hissediyorum. Ancak bu önerilere dayanarak, bir julhandler uzantısını 'hackledim' ve bu bir tedavi olarak çalışıyor.
Kısa bir özet. Uzat 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(){}
}
Açıkçası, istediğiniz / istediğiniz / ihtiyaç duyduğunuz kadar depolayabilir LogRecordveya bir taşma elde edene kadar hepsini bir yığına itebilirsiniz.
Junit testi için hazırlıkta, bir tane yaratırsınız java.util.logging.Loggerve buna yeni bir LogHandlerşey eklersiniz :
@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);
Çağrı setUseParentHandlers(), normal işleyicileri susturmaktır, böylece (bu junit-test çalıştırması için) gereksiz günlük kaydı olmaz. Test altındaki kodunuz bu günlükçüyü kullanmak için ne gerekiyorsa yapın, testi çalıştırın ve assert
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Tabii ki, bu çalışmanın büyük bir bölümünü bir @Beforeyönteme taşıyacak ve çeşitli başka iyileştirmeler yapacaksınız, ancak bu, bu sunumu karmaşık hale getirecektir.)
logger.getAllAppenders(), sonra adım atmak veappender.setThreshold(Level.OFF)her birini çağırmak (ve bittiğinde onları sıfırlamak!). Bu, oluşturmaya çalıştığınız "kötü" iletilerin test günlüklerinde görünmemesini ve bir sonraki geliştiriciyi korkutmasını sağlar.