Trochę późno, ale nadal ...
Jak konfiguracji rejestrowania powinny być łatwe do wymiany, gdy testowanie jednostkowe, można skonfigurować tak, aby zalogować się na stdout i uchwycić, że przed wykonaniem przedmiotu rejestrowania. Następnie ustaw rejestrator jako cichy dla wszystkich prócz testowanego przedmiotu.
@Test
public void test()
{
String log = captureStdOut(() -> {
// ... invoke method that shouldn't log
});
assertThat(log, is(emptyString()));
}
public static String captureStdOut(Runnable r)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = System.out;
try {
System.setOut(new PrintStream(baos, true, StandardCharsets.UTF_8.name()));
r.run();
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("End of the world, Java doesn't recognise UTF-8");
} finally {
System.setOut(out);
}
}
a jeśli stosowane slf4j nad log4j w testach, proste log4j.properties:
log4j.rootLogger=OFF, out
log4j.category.com.acme.YourServlet=INFO, out
log4j.appender.out=org.apache.log4j.ConsoleAppender
log4j.appender.out.layout=org.apache.log4j.PatternLayout
log4j.appender.out.layout.ConversionPattern=%-5p %c{1}:%L - %m%n
Lub jeśli niechętnie konfiguracja jako zewnętrzne zależności w testach jednostkowych, następnie programowo skonfigurować log4j:
//...
static final String CONSOLE_APPENDER_NAME = "console.appender";
private String pattern = "%d [%p|%c|%C{1}] %m%n";
private Level threshold = Level.ALL;
private Level defaultLevel = Level.OFF;
//...
public void configure()
{
configureRootLogger();
configureConsoleAppender();
configureCustomLevels();
}
private void configureConsoleAppender()
{
ConsoleAppender console = new ConsoleAppender();
console.setName(CONSOLE_APPENDER_NAME);
console.setLayout(new PatternLayout(pattern));
console.setThreshold(threshold);
console.activateOptions();
Logger.getRootLogger().addAppender(console);
}
private void configureRootLogger()
{
Logger.getRootLogger().getLoggerRepository().resetConfiguration();
Logger.getRootLogger().setLevel(defaultLevel);
}
Zrobiłem przekierowanie dziennika w testach jednostkowych i innym możliwym rozwiązaniem jest po prostu dołączyć dziennik 'Record's się do' List', zamiast dołączyć sformatowane wiadomości do String/StringBuffer. –
@AlistairIsrael, dobry pomysł, dzięki. Łatwiej będzie o nich myśleć jako o "Liście". –