问题描述
我有一些测试代码,它调用Java记录器来报告其状态。
在JUnit测试代码中,我想验证在此记录器中是否输入了正确的日志条目。以下几行:
I have some code-under-test that calls on a Java logger to report its status.In the JUnit test code, I would like to verify that the correct log entry was made in this logger. Something along the following lines:
methodUnderTest(bool x){
if(x)
logger.info("x happened")
}
@Test tester(){
// perhaps setup a logger first.
methodUnderTest(true);
assertXXXXXX(loggedLevel(),Level.INFO);
}
我想这可以通过特别改编的记录器(或处理程序,或格式化程序),但我更愿意重用已经存在的解决方案。 (而且,说实话,我不清楚如何从记录器获取logRecord,但假设这是可能的。)
I suppose that this could be done with a specially adapted logger (or handler, or formatter), but I would prefer to re-use a solution that already exists. (And, to be honest, it is not clear to me how to get at the logRecord from a logger, but suppose that that's possible.)
推荐答案
非常感谢这些(令人惊讶的)快速而有用的答案;他们让我的解决方案正确。
Thanks a lot for these (surprisingly) quick and helpful answers; they put me on the right way for my solution.
代码库是我想要使用它,使用java.util.logging作为其记录器机制,我不知道在这些代码中有足够的感觉完全改变它到log4j或记录器接口/外墙。但基于这些建议,我'hack-up'一个j.u.l.handler扩展名,可以作为一种享受。
The codebase were I want to use this, uses java.util.logging as its logger mechanism, and I don't feel at home enough in those codes to completely change that to log4j or to logger interfaces/facades. But based on these suggestions, I 'hacked-up' a j.u.l.handler extension and that works as a treat.
下面是一个简短的摘要。扩展 java.util.logging.Handler
:
A short summary follows. Extend 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
中存储你喜欢/想要/需要的东西,或者全部推送它们进入堆栈直到出现溢出。
Obviously, you can store as much as you like/want/need from the LogRecord
, or push them all into a stack until you get an overflow.
在准备junit-test时,创建一个 java.util.logging.Logger
并向其添加一个新的 LogHandler
:
In the preparation for the junit-test, you create a java.util.logging.Logger
and add such a new LogHandler
to it:
@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:
The call to setUseParentHandlers()
is to silence the normal handlers, so that (for this junit-test run) no unnecessary logging happens. Do whatever your code-under-test needs to use this logger, run the test and assertEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(当然,你会将这项工作的大部分内容转移到 @Before
方法并进行各种其他改进,但这会使这个演示文稿变得混乱。)
(Of course, you would move large part of this work into a @Before
method and make assorted other improvements, but that would clutter this presentation.)
这篇关于如何在记录器中对消息执行JUnit断言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!