Merci beaucoup pour ces réponses (surprenamment) rapides et utiles; elles m'ont mis sur la bonne voie pour ma solution.
La base de code où je veux utiliser ceci utilise java.util.logging comme mécanisme de journalisation, et je ne me sens pas assez à l'aise dans ces codes pour changer complètement cela en log4j ou en interfaces/facades de journalisation. Mais en me basant sur ces suggestions, j'ai "bidouillé" une extension de j.u.l.handler et ça marche à merveille.
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(){}
}
Évidemment, vous pouvez stocker autant que vous le souhaitez de LogRecord
ou les pousser tous dans une pile jusqu'à ce qu'il y ait un dépassement.
Dans la préparation du test junit, vous créez un java.util.logging.Logger
et ajoutez un tel nouveau LogHandler
à celui-ci:
@Test tester() {
Logger logger = Logger.getLogger("mon journal de test junit");
LogHandler handler = new LogHandler();
handler.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
L'appel à setUseParentHandlers()
est pour silencer les gestionnaires normaux, de sorte que (pour cette exécution de test junit) aucune journalisation inutile ne se produise. Faites ce que votre code sous test doit faire avec ce journal, exécutez le test et assertEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // voir question originale.
assertEquals("Niveau de journalisation comme prévu?", Level.INFO, handler.checkLevel() );
}
(Bien sûr, vous déplaceriez une grande partie de ce travail dans une méthode @Before
et apporteriez diverses autres améliorations, mais cela encombrerait cette présentation.)