Большое спасибо за эти (удивительно) быстрые и полезные ответы; они поставили меня на правильный путь для моего решения.
Кодовая база, где я хочу использовать это, использует java.util.logging в качестве механизма ведения журнала, и я не чувствую себя как дома в этих кодах, чтобы полностью изменить это на log4j или на интерфейсы / фасады logger Но, основываясь на этих предложениях, я «взломал» расширение j.u.l.handler, и это работает как удовольствие.
Краткое резюме следует. Продлить java.util.logging.Handler
:
class LogHandler extends Handler
{
Level lastLevel = Level.FINEST;
public Level checkLevel() {
return lastLevel;
}
public void publish(LogRecord record) {
lastLevel = record.getLevel();
}
public void close(){}
public void flush(){}
}
Очевидно, вы можете хранить столько, сколько захотите / хотите / нуждаетесь из LogRecord
, или помещать их все в стек, пока не получите переполнение.
При подготовке к тесту junit вы создаете java.util.logging.Logger
и добавляете в него такой новый LogHandler
:
@Test tester() {
Logger logger = Logger.getLogger("my junit-test logger");
LogHandler handler = new LogHandler();
handler.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
Призыв к setUseParentHandlers()
состоит в том, чтобы заставить замолчать обычные обработчики, чтобы (для этого теста junit) не происходило ненужного ведения журнала. Сделайте все, что нужно вашему тестируемому коду, чтобы использовать этот регистратор, запустите тест и assertEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Конечно, вы бы переместили большую часть этой работы в метод @Before
и внесли множество других улучшений, но это загромождает эту презентацию.)