非常感谢您提供这些快速而有用的答案;他们使我找到了解决问题的正确方法。
我想使用此代码库,将java.util.logging用作其记录器机制,而我对这些代码并不满意,无法完全将其更改为log4j或记录器接口/立面。但是基于这些建议,我“修改”了一个变戏法者扩展程序,并且可以作为一种对待。
简短摘要如下。扩展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的过程中,您创建了一个,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)
(并在完成后将其重置!)。这样可以确保您尝试生成的“不良”消息不会出现在测试日志中,并且会吓到下一个开发人员。