Some times the only thing we are interested in testing is weather a log line correctly gets logged. This is not the most optimal test but sometimes its required... in cases where log lines are getting monitored by a monitoring agent and we want to make sure correct format gets logged etc.
The trick is to mock the Log Appender and then capture the logs on that appender in a safe way. Once these log lines are captured you can verify them to your hearts content....
A fully working example of this is given at: https://github.com/njaiswal/logLineTester
Following snippet shows how to achieve this:
The trick is to mock the Log Appender and then capture the logs on that appender in a safe way. Once these log lines are captured you can verify them to your hearts content....
A fully working example of this is given at: https://github.com/njaiswal/logLineTester
Following snippet shows how to achieve this:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Fully working test at: https://github.com/njaiswal/logLineTester/blob/master/src/test/java/com/nj/Utils/UtilsTest.java | |
@Test | |
public void testUtilsLog() throws InterruptedException { | |
Logger utilsLogger = (Logger) LoggerFactory.getLogger("com.nj.utils"); | |
final Appender mockAppender = mock(Appender.class); | |
when(mockAppender.getName()).thenReturn("MOCK"); | |
utilsLogger.addAppender(mockAppender); | |
final List<String> capturedLogs = Collections.synchronizedList(new ArrayList<>()); | |
final CountDownLatch latch = new CountDownLatch(3); | |
//Capture logs | |
doAnswer((invocation) -> { | |
LoggingEvent loggingEvent = invocation.getArgumentAt(0, LoggingEvent.class); | |
capturedLogs.add(loggingEvent.getFormattedMessage()); | |
latch.countDown(); | |
return null; | |
}).when(mockAppender).doAppend(any()); | |
//Call method which will do logging to be tested | |
Application.main(null); | |
//Wait 5 seconds for latch to be true. That means 3 log lines were logged | |
assertThat(latch.await(5L, TimeUnit.SECONDS), is(true)); | |
//Now assert the captured logs | |
assertThat(capturedLogs, hasItem(containsString("One"))); | |
assertThat(capturedLogs, hasItem(containsString("Two"))); | |
assertThat(capturedLogs, hasItem(containsString("Three"))); | |
} |