Muchas gracias por estas (sorprendentemente) respuestas rápidas y útiles; me pusieron en el camino correcto para mi solución.
La base de código en la que quiero usar esto, usa java.util.logging como mecanismo de registro, y no me siento lo suficientemente en casa en esos códigos para cambiar completamente eso a log4j o a las interfaces / fachadas de registro. Pero en base a estas sugerencias, `` pirateé '' una extensión de julhandler y eso funciona como un regalo.
Sigue un breve resumen. Ampliar 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, puede almacenar todo lo que quiera / desee / necesite del LogRecord
, o empujarlos a todos en una pila hasta que obtenga un desbordamiento.
En la preparación para la prueba junit, creas java.util.logging.Logger
y le agregas una nueva 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);
La llamada a setUseParentHandlers()
es silenciar los manejadores normales, para que (para esta ejecución de prueba junit) no ocurra un registro innecesario. Haga lo que necesite su código bajo prueba para usar este registrador, ejecute la prueba y afirme Equality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Por supuesto, movería gran parte de este trabajo a un @Before
método y realizaría otras mejoras variadas, pero eso saturaría esta presentación).
logger.getAllAppenders()
, luego pasar y llamarappender.setThreshold(Level.OFF)
a cada uno (¡y restablecerlos cuando haya terminado!). Esto asegura que los mensajes "malos" que intentas generar no aparezcan en los registros de prueba y asusten al próximo desarrollador.