Bardzo dziękuję za te (zaskakująco) szybkie i pomocne odpowiedzi; postawili mnie na właściwej drodze do mojego rozwiązania.
Baza kodów, w której chcę tego użyć, używa java.util.logging jako mechanizmu rejestrującego i nie czuję się wystarczająco dobrze w tych kodach, aby całkowicie zmienić to na log4j lub logger interfejsy / fasady. Ale w oparciu o te sugestie „zhakowałem” rozszerzenie julhandlera i działa to jako uczta.
Poniżej znajduje się krótkie streszczenie. Przedłuż 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(){}
}
Oczywiście możesz przechowywać tyle, ile chcesz / chcesz / potrzebujesz z LogRecord
, lub wepchnąć je wszystkie do stosu, aż pojawi się przepełnienie.
Przygotowując się do testu junit, tworzysz java.util.logging.Logger
i dodajesz LogHandler
do niego takie nowe :
@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);
Wezwanie setUseParentHandlers()
to ucisza normalne moduły obsługi, aby (dla tego testu testowego junit) nie było niepotrzebnego rejestrowania. Wykonaj wszystko, czego wymaga testowany kod, aby użyć tego programu rejestrującego, uruchom test i assertEquality:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Oczywiście, dużą część tej pracy przeniosłeś na @Before
metodę i wprowadziłeś inne ulepszenia, ale to zaśmieciłoby tę prezentację.)
logger.getAllAppenders()
, a następnie przejść i zadzwonićappender.setThreshold(Level.OFF)
do każdego (i zresetować je, gdy skończysz!). Dzięki temu „złe” wiadomości, które próbujesz wygenerować, nie pojawią się w dziennikach testu i nie przestraszą następnego programisty.