Как установить уровень логирования для теста JUnit

Я использую регистрацию Java в моих классах.

Пример:

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

Когда я пишу тест JUnit для этого класса, я хотел бы установить для уровня логики значение "FINE". Я старался:

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

Но это не имеет никакого эффекта. Как я могу контролировать уровень логирования в JUnit Test при использовании Java Logging? Я запускаю свои тесты, используя Maven.

2 ответа

Это самый простой, самый общий способ, который я нашел, чтобы установить java.util.logging уровень для тестов JUnit.

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

Когда вы запустите модульные тесты в этом классе, вы должны увидеть:

01 мая 2017 г. 12:17:12 MyTest test00a

FINE: июль тест

Logger.getLogger() documentation:

Найдите или создайте регистратор для именованной подсистемы. Если регистратор уже был создан с заданным именем, он возвращается. В противном случае создается новый регистратор.

In your case, Logger.getLogger() with the same name gives you the same logger-instance. Therefore, you can get the logger and set its level with

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

Just make sure to set it back in the @After-method later.

Чтобы решить эту проблему, я определил специальное правило 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");
Другие вопросы по тегам