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 LogRecord
veya 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.Logger
ve 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 @Before
yö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.