非常感谢这些(意外地)快速和有帮助的答案;它们为我的解决方案指明了正确的方向。
我想在代码库中使用这个,它使用 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);
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(当然,你可以将这项工作的大部分移动到一个@Before
方法中,并进行其他各种改进,但那会使这个演示变得杂乱无章。)
logger.getAllAppenders()
,然后逐个调用appender.setThreshold(Level.OFF)
(完成后要重置它们!)。这样可以确保您尝试生成的“错误”消息不会显示在测试日志中并且不会让下一个开发人员感到困惑。 - CodererListAppender<ILoggingEvent>
而不是创建自己的自定义appender。 - sinujohnLogger
转换为org.apache.logging.log4j.core.Logger
(实现该接口的实现类),则可以再次访问setAppender()/removeAppender()
。 - David Moles