当前位置: 首页 > 面试题库 >

Java 如何在记录器中对消息执行JUnit断言

何正德
2023-03-14
问题内容

我有一些正在测试的代码,它们呼吁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,但是假设这是可能的。)


问题答案:

我也需要几次。我在下面整理了一个小样本,你可以根据需要进行调整。基本上,你可以创建自己的Appender并将其添加到所需的记录器中。如果你想收集所有内容,那么根记录器是一个很好的起点,但是如果你愿意,可以使用更具体的信息。完成后,请不要忘记删除Appender,否则可能会导致内存泄漏。下面,我在测试中完成了此操作,但根据你的需要,setUp或者@Before/ tearDown@After可能是更好的地方。

同样,下面的实现将所有内容收集到一个List内存中。如果记录很多,你可能会考虑添加一个过滤器以删除无聊的条目,或将日志写入磁盘上的临时文件(提示:LoggingEventis Serializable,因此,如果你的日志消息是,则应该能够序列化事件对象是。)

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

public class MyTest {
    @Test
    public void test() {
        final TestAppender appender = new TestAppender();
        final Logger logger = Logger.getRootLogger();
        logger.addAppender(appender);
        try {
            Logger.getLogger(MyTest.class).info("Test");
        }
        finally {
            logger.removeAppender(appender);
        }

        final List<LoggingEvent> log = appender.getLog();
        final LoggingEvent firstLogEntry = log.get(0);
        assertThat(firstLogEntry.getLevel(), is(Level.INFO));
        assertThat((String) firstLogEntry.getMessage(), is("Test"));
        assertThat(firstLogEntry.getLoggerName(), is("MyTest"));
    }
}

class TestAppender extends AppenderSkeleton {
    private final List<LoggingEvent> log = new ArrayList<LoggingEvent>();

    @Override
    public boolean requiresLayout() {
        return false;
    }

    @Override
    protected void append(final LoggingEvent loggingEvent) {
        log.add(loggingEvent);
    }

    @Override
    public void close() {
    }

    public List<LoggingEvent> getLog() {
        return new ArrayList<LoggingEvent>(log);
    }
}


 类似资料:
  • 我使用的是Camel 2.9.2,完成路线定义如下: 中提供https://stackoverflow.com/questions/18877562/how-can-i-log-a-header-value-in-camel-using-spring-dsl解决方案由于某种原因对我不起作用。 我可以看到一些与路由定义相关的驼峰跟踪

  • 我调整了我的Spring启动执行器活动/准备日志在application.properties文件 但是它在KuberNate环境中记录健康检查日志... 有没有办法关掉健康检查日志... 感谢你的回应...

  • 这是我的超文本标记语言PHP表页面的完整代码...

  • 我在测试中有一段代码,使用Hamcrest 2.2检查结果列表是否包含某些属性: 当是一个普通的类时,这个工作非常好。但是在我将它更改为之后,Hamcrest的抱怨没有名为的属性: 是否有其他匹配器可以用来实现与之前相同的匹配?或者其他解决方法可以用来让它与记录一起工作?

  • 问题内容: 我正在开发一个简单的桌面应用程序(不是webapp)。 这是我的: 如你所见,为了消除控制台中的Spring日志消息,我尝试了以下解决方案: 当我从代码中调用log4j记录器时,记录消息是根据上面指定的模式进行的(这很好)。 但是,最糟糕的是-我仍然从Spring进入控制台的DEBUG级别消息…它们看起来像这里: 无法禁用日志记录消息 他们有不同的模式。好像他们忽略了我的设置。 我还尝

  • 我写了一个应用程序,可以在NFC标签上读写ndef消息。我的应用程序可以在NDEF消息中读取和写入两条NDEF记录。但当我展示一个在NDEF消息中只有一条NDEF记录的标签时,应用程序崩溃了。我知道背后的原因。我也知道如何解决它,但要解决它,我需要知道如何获得NDEF消息中的记录数?