이 (놀랍게도) 빠르고 유용한 답변에 감사드립니다. 그들은 내 솔루션에 맞는 길로 나를 안내했습니다.
코드베이스는 이것을 사용하고, 로거 메커니즘으로 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-test 준비 과정에서 a를 작성 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 테스트 실행에 대한) 불필요한 로깅이 발생하지 않도록, 일반 핸들러를 침묵하는 것입니다. 테스트중인 코드가이 로거를 사용하는 데 필요한 모든 작업을 수행하고 테스트를 실행하고 동일성을 지정하십시오.
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(물론이 작품의 많은 부분을 @Before
방법 으로 옮기고 여러 가지 개선 사항을 만들지 만이 프리젠 테이션을 어지럽 힐 수 있습니다.)
logger.getAllAppenders()
한 다음 단계별로 호출appender.setThreshold(Level.OFF)
하고 각각을 호출 하는 것입니다 (완료되면 재설정하십시오!). 이렇게하면 생성하려는 "잘못된"메시지가 테스트 로그에 표시되지 않고 다음 개발자를 놀라게 할 수 있습니다.