-
-
Save bloodredsun/a041de13e57bf3c6c040 to your computer and use it in GitHub Desktop.
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) { | |
LOG.info("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 org.hamcrest.CoreMatchers.is; | |
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 | |
*/ | |
@RunWith(MockitoJUnitRunner.class) | |
public class ExampleThatLogsTest { | |
@Mock | |
private Appender mockAppender; | |
//Captor is genericised with ch.qos.logback.classic.spi.LoggingEvent | |
@Captor | |
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 | |
@Before | |
public void setup() { | |
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); | |
logger.addAppender(mockAppender); | |
} | |
//Always have this teardown otherwise we can stuff up our expectations. Besides, it's | |
//good coding practise | |
@After | |
public void teardown() { | |
final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); | |
logger.detachAppender(mockAppender); | |
} | |
@Test | |
public void shouldConcatAndLog() { | |
//given | |
ExampleThatLogs example = new ExampleThatLogs(); | |
//when | |
final String result = example.concat("foo", "bar"); | |
//then | |
assertEquals("foobar", result); | |
//Now verify our logging interactions | |
verify(mockAppender).doAppend(captorLoggingEvent.capture()); | |
//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 | |
assertThat(loggingEvent.getFormattedMessage(), | |
is("String a:foo, String b:bar")); | |
} | |
} |
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:
mockAppender.doAppend();
-> at com.br.ExampleThatLogsTest.shouldConcatAndLog(ExampleThatLogsTest.java:61)
Actually, there were zero interactions with this mock.
A big and fat THANK YOU for your share. Thumbs up!
Very Helpful! Thank You!
Can you please share your logback.xml?
So handy! Thanks!
Thank you!
I had the same code but all my logger imports were from log4j package due to which I was getting error while doing Mockito.verify()
Error : Wanted but not invoked:
mockAppender.doAppend();
Actually, there were zero interactions with this mock.
After looking at your code, I changed all my imports to logback and it worked like a charm!
Very helpful