logback日志记录的独立单元测试

时间:2016-07-19 20:30:27

标签: java unit-testing logback

我有一些记录HTTP请求的代码。出于合规性原因,我必须确保某些事情没有记录,所以我进行了单元测试。基本的测试结构类似于:

  private ListAppender<ILoggingEvent> addListAppender() {
    ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
    listAppender.start();
    ch.qos.logback.classic.Logger loggingHandlerLogger =
        (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LoggingHandler.class);
    loggingHandlerLogger.addAppender(listAppender);
    return listAppender;
  }

  private void detachAppender(ListAppender<ILoggingEvent> listAppender) {
    ch.qos.logback.classic.Logger loggingHandlerLogger =
        (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LoggingHandler.class);
    loggingHandlerLogger.detachAppender(listAppender);
    listAppender.stop();
  }

  @Test
  public void testResponseCookieKeysButNotValuesAreLogged() throws Exception {
    ListAppender<ILoggingEvent> listAppender = addListAppender();
    try {
      // ... do things that cause logging
      assertThat(countInListContaining(listAppender.list, cookie1Value)).isEqualTo(0);
      // etc.
    } finally {
      detachAppender(listAppender);
    }
  }

这有效除了我的测试不是独立的。我的测试是连续运行的(通过Gradle,并行测试被禁用),但似乎有一场比赛,因此有时前一次测试产生的日志会在下一次测试中以listAppender结束。

我认为正在发生的事情是测试A产生了一些日志,因此Logger拥有它们。然后,测试B在Logger有机会将这些消息发送到所有appender之前运行。测试B附加ListAppender,然后测试A中的一些消息被发送到新的appender。我认为我需要做的是在添加新的appender之前以某种方式确保Logger为“空”但我在flush上看不到类似Logger方法的内容。在添加新的appender之前,如何确保处理先前测试的所有日志?

0 个答案:

没有答案