package es.moki; import com.google.common.collect.Lists; import org.apache.log4j.Appender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.mockito.ArgumentCaptor; import java.util.List; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; public class LoggingSpy { private Appender appenderMock = mock(Appender.class); private Level originalLevel; private Logger logger; public LoggingSpy(Class loggedClass, Level logLevelToObserve) { logger = Logger.getLogger(loggedClass); originalLevel = logger.getLevel(); logger.addAppender(appenderMock); logger.setLevel(logLevelToObserve); } public String observedMessage() { ArgumentCaptor loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class); verify(appenderMock).doAppend(loggingEventCaptor.capture()); return loggingEventCaptor.getValue().getMessage().toString(); } public List observedMessages(int numExpectedMessages) { ArgumentCaptor loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class); verify(appenderMock, times(numExpectedMessages)).doAppend(loggingEventCaptor.capture()); List messages = Lists.newArrayList(); for (LoggingEvent loggingEvent : loggingEventCaptor.getAllValues()) { messages.add(loggingEvent.getMessage().toString()); } return messages; } public Throwable observedThrowable() { ArgumentCaptor loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class); verify(appenderMock).doAppend(loggingEventCaptor.capture()); return loggingEventCaptor.getValue().getThrowableInformation().getThrowable(); } public void restoreLogLevel() { logger.setLevel(originalLevel); } }