【问题标题】:How to set the Loglevel for a JUnit Test如何为 JUnit 测试设置日志级别
【发布时间】:2023-03-18 14:56:01
【问题描述】:

我在我的课程中使用 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 还是其他方式?
  • 试试Logger.getLogger("").setLevel(Level.FINE)

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


【解决方案1】:

这是我发现为 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 测试00a

很好:J.U.L.测试

【讨论】:

    【解决方案2】:

    Logger.getLogger() 文档:

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

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

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

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

    【讨论】:

    • 感谢您的回答,但这不起作用。也许我还需要设置一些额外的全局日志级别?我调试了代码,我的班级现在正在记录 - 但没有进入标准输出。我正在使用 Maven 运行测试。
    • @Ralph 请参阅this answer 了解适用于类级别的完整示例。
    【解决方案3】:

    为了解决这个问题,我定义了一个自定义的 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");
    

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 2018-05-31
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2018-08-22
      • 2017-10-29
      • 2015-08-03
      相关资源
      最近更新 更多