非常感谢这些(令人惊讶的)快速而有用的答案;他们让我找到了正确的解决方案。
代码库是我想使用它,使用 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-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 方法中并进行各种其他改进,但这会使演示文稿变得混乱。)