Grazie mille per queste risposte (sorprendentemente) veloci e utili; mi hanno messo sulla strada giusta per la mia soluzione.
La base di codice in cui voglio usarlo, usa java.util.logging come meccanismo di logger, e in quei codici non mi sento abbastanza a mio agio da cambiarlo completamente in log4j o interfacce / facciate del logger. Ma sulla base di questi suggerimenti, ho "modificato" un'estensione julhandler e che funziona come un piacere.
Segue un breve riassunto. Estendere 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(){}
}
Ovviamente, puoi archiviare quanto vuoi / desideri / desideri dal LogRecord
, oppure inserirli tutti in uno stack fino a ottenere un overflow.
Nella preparazione per il test junit, si crea un java.util.logging.Logger
e si aggiunge un nuovo LogHandler
ad esso:
@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);
La chiamata a setUseParentHandlers()
è di mettere a tacere i gestori normali, in modo che (per questa esecuzione di test junit) non avvenga alcuna registrazione non necessaria. Fai qualunque cosa il tuo codice sotto test abbia bisogno per usare questo logger, esegui il test e asserisci
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Naturalmente, sposteresti gran parte di questo lavoro in un @Before
metodo e apporteresti altri miglioramenti assortiti, ma ciò ingombrerebbe questa presentazione.)
logger.getAllAppenders()
, quindi scorrere e chiamareappender.setThreshold(Level.OFF)
ciascuno (e ripristinarli quando hai finito!). Questo si assicura che i messaggi "cattivi" che si sta tentando di generare non vengano visualizzati nei registri dei test e spaventano lo sviluppatore successivo.