Merci beaucoup pour ces réponses (étonnamment) rapides et utiles; ils m'ont mis sur la bonne voie pour ma solution.
La base de code où je veux l'utiliser, utilise java.util.logging comme mécanisme d'enregistrement, et je ne me sens pas suffisamment à l'aise dans ces codes pour changer complètement cela en log4j ou en interfaces / façades d'enregistreur. Mais sur la base de ces suggestions, j'ai «piraté» une extension julhandler et cela fonctionne comme un régal.
Un bref résumé suit. Étendre 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(){}
}
De toute évidence, vous pouvez stocker autant que vous le souhaitez / voulez / besoin de la LogRecord
, ou les pousser tous dans une pile jusqu'à ce que vous obteniez un débordement.
Dans la préparation du junit-test, vous créez un java.util.logging.Logger
et ajoutez-en un nouveau 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);
L'appel à setUseParentHandlers()
est de faire taire les gestionnaires normaux afin que (pour cette exécution de test de junit) aucune journalisation inutile ne se produise. Faites tout ce dont votre code sous test a besoin pour utiliser cet enregistreur, exécutez le test et assertEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Bien sûr, vous déplaceriez une grande partie de ce travail dans une @Before
méthode et apporteriez d'autres améliorations, mais cela encombrerait cette présentation.)
logger.getAllAppenders()
, puis de passer à travers et d'appelerappender.setThreshold(Level.OFF)
chacun (et de les réinitialiser lorsque vous avez terminé!). Cela garantit que les "mauvais" messages que vous essayez de générer n'apparaissent pas dans les journaux de test et ne paniquent pas le prochain développeur.