How to intercept SLF4J (with logback) logging via a JUnit test?

后端 未结 8 904
天涯浪人
天涯浪人 2020-12-04 10:52

Is it possible to somehow intercept the logging (SLF4J + logback) and get an InputStream (or something else that is readable) via a JUnit test case...?

8条回答
  •  一整个雨季
    2020-12-04 11:53

    I would recommend a simple, reusable spy implementation that can be included in a test as JUnit rule:

    public final class LogSpy extends ExternalResource {
    
        private Logger logger;
        private ListAppender appender;
    
        @Override
        protected void before() {
            appender = new ListAppender<>();
            logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); // cast from facade (SLF4J) to implementation class (logback)
            logger.addAppender(appender);
            appender.start();
        }
    
        @Override
        protected void after() {
            logger.detachAppender(appender);
        }
    
        public List getEvents() {
            if (appender == null) {
                throw new UnexpectedTestError("LogSpy needs to be annotated with @Rule");
            }
            return appender.list;
        }
    }
    

    In your test, you'd activate the spy in the following way:

    @Rule
    public LogSpy log = new LogSpy();
    

    Call log.getEvents() (or other, custom methods) to check the logged events.

提交回复
热议问题