Instantly share code, notes, and snippets.

What would you like to do?
Unit testing logback based logging statements
package com.brs;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* Simple class that we use to trigger a log statement.
public class ExampleThatLogs {
private static final Logger LOG = LoggerFactory.getLogger(ExampleThatLogs.class);
public String concat(String a, String b) {"String a:" + a + ", String b:" + b);
return a+b;
package com.brs;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.Appender;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.slf4j.LoggerFactory;
import static;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.verify;
* Our Test class shows how we can hook into logback with mockito to see the
* logging activity
public class ExampleThatLogsTest {
private Appender mockAppender;
//Captor is genericised with ch.qos.logback.classic.spi.LoggingEvent
private ArgumentCaptor<LoggingEvent> captorLoggingEvent;
//I've cheated a little here and added the mockAppender to the root logger
//It's not quite necessary but it also shows you how it can be done
public void setup() {
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
//Always have this teardown otherwise we can stuff up our expectations. Besides, it's
//good coding practise
public void teardown() {
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
public void shouldConcatAndLog() {
ExampleThatLogs example = new ExampleThatLogs();
final String result = example.concat("foo", "bar");
assertEquals("foobar", result);
//Now verify our logging interactions
//Having a genricised captor means we don't need to cast
final LoggingEvent loggingEvent = captorLoggingEvent.getValue();
//Check log level is correct
assertThat(loggingEvent.getLevel(), is(Level.INFO));
//Check the message being logged is correct
is("String a:foo, String b:bar"));

This comment has been minimized.

coryellenberger commented Nov 5, 2015

Very helpful


This comment has been minimized.

klassounski-daitan commented Jun 30, 2016

Could you show me the pom please? I'm having a problem and probably because of the packages versions.
I'm getting:

Wanted but not invoked:
-> at
Actually, there were zero interactions with this mock.


This comment has been minimized.

birqan commented May 24, 2017

A big and fat THANK YOU for your share. Thumbs up!


This comment has been minimized.

abbas-mohamad commented Dec 14, 2017

Very Helpful! Thank You!


This comment has been minimized.

mallesh-np commented Mar 5, 2018

Can you please share your logback.xml?


This comment has been minimized.

nvlinh commented May 21, 2018

I use @RunWith(SpringJUnit4ClassRunner.class) for run it, but not work, please tell me the way use it with @RunWith(SpringJUnit4ClassRunner.class)


This comment has been minimized.

manueldeveloper commented Sep 28, 2018

So handy! Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment