非常感謝這些(令人驚訝的)快速和有益的答案;他們爲我的解決方案提供了正確的方式。
代碼庫是我想要使用它,使用java.util.logging作爲它的記錄器機制,並且我不覺得在這些代碼中有足夠的空間來將它完全更改爲log4j或記錄器接口/外觀。但基於這些建議,我'破解'了一個j.u.l.handler擴展,並且作爲一種享受。
以下是一個簡短的總結。擴展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測試的準備,爲您營造一個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的測試運行)不會發生不必要的記錄。做任何你的代碼下測試需要使用這個記錄器,運行測試和assertEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel());
}
(當然,你將這項工作的很大一部分進入一個@Before
方法,使各種其他改進,但這將會使這個演示文稿變得混亂。)
來源
2009-12-02 18:14:51
Jon
YES!在這種情況下,這感覺比傳統的嘲笑要優越。 – Buhb 2009-12-01 19:53:11
這很好用。我所做的唯一改進就是調用'logger.getAllAppenders()',然後遍歷並調用每個appender.setThreshold(Level.OFF)(並在完成後重置它們!)。這可以確保您嘗試生成的「壞」消息不會顯示在測試日誌中,並且會嚇跑下一個開發人員。 – Coderer 2013-03-07 11:20:10
這將如何工作Log4j 2.x? – 2015-12-14 13:47:03