Большое спасибо за эти (удивительно) быстрые и полезные ответы; они поставили меня на правильный путь для моего решения.
Кодовая база, в которой я хочу использовать это, использует java.util.logging в качестве механизма ведения журнала, и я не чувствую себя как дома в этих кодах, чтобы полностью изменить это на log4j или на интерфейсы / фасады регистратора. Но, основываясь на этих предложениях, я «взломал» расширение julhandler, и это работает как удовольствие.
Краткое резюме следует. Расширить 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
метод и внесли множество других улучшений, но это загромождает эту презентацию.)
logger.getAllAppenders()
, затем пройти и позвонитьappender.setThreshold(Level.OFF)
каждому (и сбросить их, когда вы закончите!). Это гарантирует, что «плохие» сообщения, которые вы пытаетесь сгенерировать, не появятся в журналах тестов и не пугает следующего разработчика.