I'm adapting Haim's answer to something that's more RAII:
public static class TestAppender extends AppenderSkeleton {
@Override
protected void append(LoggingEvent event) {
messages.add(event.getRenderedMessage());
}
@Override
public void close() { }
@Override
public boolean requiresLayout() { return false; }
protected final List messages = new ArrayList<>();
}
static class LogGuard implements AutoCloseable {
protected final TestAppender appender;
LogGuard(Level level) {
appender = new TestAppender();
appender.setThreshold(level);
Logger.getRootLogger().addAppender(appender);
}
@Override
public void close() throws Exception {
Logger.getRootLogger().removeAppender(appender);
}
}
And then the usage is simply:
try (LogGuard log = new LogGuard(Level.WARN)) { // if you want WARN or higher
// do what causes the logging
Assert.assertTrue(log.appender.messages.stream().anyMatch(m -> m.equals("expected"));
}