如何为JUnit测试设置日志级别

11

我在我的类中使用Java日志记录。

示例:

public class MyClass  {
    private static Logger logger = Logger.getLogger(MyClass.class.getName());
    ....
}

当我为该类编写JUnit测试时,我想将Loglevel设置为“FINE”。我尝试过:

@Before
public void setup() throws PluginException {
    Logger.getGlobal().setLevel(Level.FINE);
    ....
}

但这没有任何影响。 当使用Java Logging时,我如何在JUnit测试中控制日志级别? 我正在使用Maven运行我的测试。


你是如何运行单元测试的?使用Maven还是其他方式? - Krzysztof Krasoń
尝试使用 Logger.getLogger("").setLevel(Level.FINE) - Andrew Logvinov
3个回答

8

这是我找到的设置JUnit测试的java.util.logging级别最简单、最通用的方法。

import java.util.logging.Level;
import java.util.logging.Logger;

import org.junit.BeforeClass;
import org.junit.Test;

public class MyTest
{
    @BeforeClass
    public static void beforeClass()
    {
        System.setProperty("java.util.logging.config.file", ClassLoader.getSystemResource("logging.properties").getPath());
    }

    @Test
    public void test00a()
    {
        Logger.getLogger(MyTest.class.getName()).log(Level.FINE, "J.U.L. test");
    }
}

src/test/resources 目录下创建 logging.properties 文件(.level 必须是第一行):
.level=FINEST
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST

当您在此类中运行单元测试时,应该看到以下内容:

2017年5月1日 下午12:17:12 MyTest test00a

FINE: J.U.L. 测试


1

Logger.getLogger() 文档:

查找或创建命名子系统的记录器。如果已经使用给定名称创建了记录器,则返回该记录器。否则,将创建一个新的记录器。

在您的情况下,使用相同名称的 Logger.getLogger() 将为您提供相同的记录器实例。因此,您可以获取记录器并设置其级别:

@Before
public void setup() throws PluginException {
    Logger.getLogger(MyClass.class.getName()).setLevel(Level.FINE);
    ...
}

只需确保稍后在 @After 方法中将其设置回来。


3
谢谢你的回答,但是这并没有起作用。也许我需要设置一些额外的全局日志级别?我调试了代码,我的类现在正在记录日志,但不是输出到标准输出流中。我正在使用 Maven 运行测试。 - Ralph
@Ralph,请查看此答案,其中包含可以在类级别上工作的完整示例:https://dev59.com/-1kT5IYBdhLWcg3wefMn#43722641 - Parker
如果您使用SLF4J,则无法设置级别。您可以通过将记录器转换为其底层实现来解决此问题。在我的情况下,这是Logback(Spring Boot的默认值)。@BeforeEach public void setup() { ch.qos.logback.classic.Logger logger = (Logger) org.slf4j.LoggerFactory.getLogger(MyClass.class.getName()); logger.setLevel(Level.TRACE); } - Bampfer

0
为了解决这个问题,我定义了一个自定义的JUnit 4规则来禁用特定测试的日志:
@RequiredArgsConstructor
public class LogLevelRule extends TestWatcher {

  private Level oldLevel;
  private final Class clazz;
  private final String levelString;

  @Override
  protected void starting(Description description) {
    oldLevel = Logger.getLogger(clazz).getLevel();
    Logger.getLogger(clazz).setLevel(Level.toLevel(levelString));
  }

  @Override
  protected void finished(Description description) {
    Logger.getLogger(clazz).setLevel(oldLevel);
  }
}

这可以通过在特定的测试中声明@Rule@ClassRule来启用:

  @ClassRule
  public static LogLevelRule logLevelRule = new LogLevelRule(MyClass.class, "OFF");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接