Я нашел решение, см. Мой собственный ответ ниже. У кого-нибудь есть более элегантный?
Я хочу сделать это, чтобы увеличить охват кода и найти тонкие ошибки.
Предположим, что тестируется следующий класс:
public class Foo {
private final Logger logger = LoggerFactory.getLogger(Foo.class);
public void bar() {
String param=[..];
if(logger.isInfoEnabled()) logger.info("A message with parameter {}", param);
if(logger.isDebugEnabled()) {
// some complicated preparation for the debug message
logger.debug([the debug message]);
}
}
}
и следующий тестовый класс:
public class FooTest {
@Test
public void bar() {
Foo foo=new Foo();
foo.bar();
}
}
Инструмент покрытия кода, например, Cobertura правильно сообщит, что только некоторые из условных ветвей были проверены.
info и debug либо активируются, либо деактивируются для регистратора.
Помимо того, что вы плохо выглядите в своей оценке покрытия, это представляет реальный риск.
Что если есть какой-то побочный эффект, вызванный кодом внутри if (logger.isDebugEnabled ())? Что если ваш код работает только в том случае, если DEBUG включен, и с треском проваливается, если уровень журнала установлен на INFO? (Это на самом деле произошло в одном из наших проектов: p)
Итак, мой вывод заключается в том, что код, содержащий операторы логгера, всегда должен тестироваться один раз при включенном ведении журнала и один раз при отключенном ведении журнала ...
Есть ли способ сделать что-то подобное с JUnit? Я знаю, как глобально включить или отключить всю мою регистрацию в Logback, поэтому проблема заключается в следующем: как выполнить тесты дважды, один раз с включенным ведением журнала, один раз с отключенным ведением журнала.
p.s. Мне известен этот вопрос , но я не думаю, что это дубликат. Меня меньше беспокоят абсолютные значения покрытия, а тонкие, трудно обнаруживаемые ошибки, которые могут содержаться внутри if (logger.isDebugEnabled ()).