如何为JUnit测试设置Loglevel

时间:2016-07-25 11:43:46

标签: java maven logging junit java.util.logging

我在我的课程中使用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 Test中控制loglevel? 我正在使用Maven运行我的测试。

3 个答案:

答案 0 :(得分:4)

这是我发现为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 must be the first line):

.level=FINEST
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST

当您在此课程中运行单元测试时,您应该看到:

  

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

     

精细:J.U.L。测试

答案 1 :(得分:0)

Logger.getLogger()文档:

  

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

在您的情况下,具有相同名称的Logger.getLogger()为您提供相同的logger-instance。因此,您可以使用

获取记录器并设置其级别
@Before
public void setup() throws PluginException {
    Logger.getLogger(MyClass.class.getName()).setLevel(Level.FINE);
    ...
}

请确保稍后在@ After-method中将其重新设置。

答案 2 :(得分: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");
相关问题