我有一些被测代码调用 Java 记录器来报告其状态。在 JUnit 测试代码中,我想验证是否在此记录器中创建了正确的日志条目。大致如下:
methodUnderTest(bool x){
if(x)
logger.info("x happened")
}
@Test tester(){
// perhaps setup a logger first.
methodUnderTest(true);
assertXXXXXX(loggedLevel(),Level.INFO);
}
我想这可以用一个特别适应的记录器(或处理程序,或格式化程序)来完成,但我更愿意重新使用已经存在的解决方案。 (老实说,我不清楚如何从记录器获取 logRecord,但假设这是可能的。)
原文由 Jon 发布,翻译遵循 CC BY-SA 4.0 许可协议
非常感谢这些(令人惊讶的)快速而有用的答案;他们让我走上了解决问题的正确道路。
代码库是我想使用它,使用 java.util.logging 作为它的记录器机制,而且我对这些代码感觉不够熟悉,无法将其完全更改为 log4j 或记录器接口/外观。但基于这些建议,我“破解”了一个 julhandler 扩展,这是一种享受。
下面是一个简短的总结。扩展
java.util.logging.Handler
:显然,您可以从
LogRecord
存储尽可能多的内容,或者将它们全部推入堆栈直到溢出。在准备 junit-test 时,您创建一个
java.util.logging.Logger
并添加这样一个新的LogHandler
到它:对
setUseParentHandlers()
的调用是为了使正常处理程序静音,以便(对于此 junit-test 运行)不会发生不必要的日志记录。做任何你的被测代码需要使用这个记录器,运行测试和 assertEquality:(当然,您可以将大部分工作转移到
@Before
方法中并进行其他各种改进,但这会使演示文稿变得混乱。)