package de.unioninvestment.eai.portal.junit.rules; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import org.apache.log4j.Appender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.rules.TestWatchman; import org.junit.runners.model.FrameworkMethod; /** * JUnit Rule for Logging Checks. * */ public class Log4jStub extends TestWatchman { private Level level = Level.INFO; private String category; private final Appender appenderMock = mock(Appender.class); public Log4jStub(String category) { this.category = category; } public Log4jStub(Class<?> classUnderTest) { this.category = classUnderTest.getName(); } public Log4jStub(String category, Level level) { this.category = category; this.level = level; } public Log4jStub(Class<?> classUnderTest, Level level) { this.category = classUnderTest.getName(); this.level = level; } @Override public void starting(FrameworkMethod method) { record(level); addAppenderToCategory(category); } @Override public void finished(FrameworkMethod method) { removeAppenderFromCategory(category); reset(appenderMock); } private void addAppenderToCategory(String category) { Logger logger = Logger.getLogger(category); logger.addAppender(appenderMock); } private void removeAppenderFromCategory(String category) { Logger logger = Logger.getLogger(category); logger.removeAppender(appenderMock); } public void record(Level level) { Logger.getLogger(category).setLevel(level); } public void assertInfo(String loggingStatement) { verify(appenderMock).doAppend( argThat(new LogMessage(Level.INFO, loggingStatement))); } public void assertWarning(String loggingStatement) { verify(appenderMock).doAppend( argThat(new LogMessage(Level.WARN, loggingStatement))); } public void assertError(String loggingStatement) { verify(appenderMock).doAppend( argThat(new LogMessage(Level.ERROR, loggingStatement))); } }