Unit testing : Asserting that a line was logged by Logback
Join the DZone community and get the full member experience.
Join For FreeI encountered a tricky problem today, I was writing a test for which the assertion was onto some function called or not. I couldn’t mock that function as it was part of an external API for which I couldn’t change the real Object to a mocked Object.
There was a solution, checking that this function was logging a particular event or not. So in order to assert that this specific line was logged or not, I added a mocked Appender. (Note: The Appender is the class that will actually do the logging, e.g. ConsoleAppender to log to the console)
I’m using two great libraries here: Mockito and Logback, please refer to my other post explaining how to configure Logback.
Here is the code:
package com.jsoft.test; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; import org.mockito.ArgumentMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.junit.Test; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MyTest { private static Logger logger = LoggerFactory.getLogger(MyTest.class); @Test public void testSomething() { ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); final Appender mockAppender = mock(Appender.class); when(mockAppender.getName()).thenReturn("MOCK"); root.addAppender(mockAppender); //... do whatever you need to trigger the log verify(mockAppender).doAppend(argThat(new ArgumentMatcher() { @Override public boolean matches(final Object argument) { return ((LoggingEvent)argument).getFormattedMessage().contains("Hey this is the message I want to see"); } })); } }
From http://jsoftbiz.wordpress.com/2011/11/29/unit-testing-asserting-that-a-line-was-logged-by-logback/
Opinions expressed by DZone contributors are their own.
Trending
-
Decoding ChatGPT: The Concerns We All Should Be Aware Of
-
Extending Java APIs: Add Missing Features Without the Hassle
-
New ORM Framework for Kotlin
-
Observability Architecture: Financial Payments Introduction
Comments