Skip to content

Instantly share code, notes, and snippets.

@mokies
Last active August 29, 2015 14:18
Show Gist options
  • Save mokies/0037f6e6c4c11fce0bd1 to your computer and use it in GitHub Desktop.
Save mokies/0037f6e6c4c11fce0bd1 to your computer and use it in GitHub Desktop.

Revisions

  1. mokies renamed this gist Apr 7, 2015. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. mokies created this gist Apr 7, 2015.
    57 changes: 57 additions & 0 deletions LoggingSpy
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,57 @@
    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<LoggingEvent> loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
    verify(appenderMock).doAppend(loggingEventCaptor.capture());
    return loggingEventCaptor.getValue().getMessage().toString();
    }

    public List<String> observedMessages(int numExpectedMessages) {
    ArgumentCaptor<LoggingEvent> loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
    verify(appenderMock, times(numExpectedMessages)).doAppend(loggingEventCaptor.capture());

    List<String> messages = Lists.newArrayList();
    for (LoggingEvent loggingEvent : loggingEventCaptor.getAllValues()) {
    messages.add(loggingEvent.getMessage().toString());
    }
    return messages;
    }

    public Throwable observedThrowable() {
    ArgumentCaptor<LoggingEvent> loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class);
    verify(appenderMock).doAppend(loggingEventCaptor.capture());
    return loggingEventCaptor.getValue().getThrowableInformation().getThrowable();
    }

    public void restoreLogLevel() {
    logger.setLevel(originalLevel);
    }
    }