Muito obrigado por estas (surpreendentemente) respostas rápidas e úteis; eles me colocaram no caminho certo para a minha solução.
A base de código onde eu quero usar isso, usa java.util.logging como mecanismo de logger, e não me sinto em casa o suficiente nesses códigos para mudar completamente isso para log4j ou para interfaces / fachadas de logger. Mas com base nessas sugestões, eu 'hackeei' uma extensão de manipulador de mensagens e isso funciona como um deleite.
Um breve resumo segue. Estender 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(){}
}
Obviamente, você pode armazenar o quanto quiser / desejar / precisar do LogRecord
, ou empurrá-los todos para uma pilha até obter um estouro.
Na preparação para o teste de junção, você cria um java.util.logging.Logger
e adiciona um novo LogHandler
a ele:
@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);
A chamada para setUseParentHandlers()
é silenciar os manipuladores normais, para que (nesta execução de teste de junção) não ocorra log desnecessário. Faça o que seu código em teste precisar para usar esse criador de logs, execute o teste e asserEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Obviamente, você moveria grande parte deste trabalho para um @Before
método e faria várias outras melhorias, mas isso atrapalharia esta apresentação.)
logger.getAllAppenders()
, depois avançar e chamarappender.setThreshold(Level.OFF)
cada um (e redefini-los quando terminar!). Isso garante que as mensagens "ruins" que você está tentando gerar não apareçam nos logs de teste e assustem o próximo desenvolvedor.