如何在记录器中对消息执行JUnit断言 [英] How to do a JUnit assert on a message in a logger

查看:104
本文介绍了如何在记录器中对消息执行JUnit断言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些测试代码,它调用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断言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆