All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nl.demon.shadowland.freedumbytes.unit.rule.LoggerRule Maven / Gradle / Ivy

package nl.demon.shadowland.freedumbytes.unit.rule;


import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import java.util.List;
import java.util.stream.Collectors;

import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.rules.ExternalResource;
import org.mockito.ArgumentCaptor;
import org.mockito.verification.VerificationMode;


/**
 * Assertions for Log4j logging behaviour in unit tests.
 *
 * @see Testing logging behaviour in four code lines flat
 * @see Easy verifying of logging events in jUnit tests with Mockito
 * @see Rules allow very flexible addition or redefinition of the behavior of each test method in a test class
 */
public class LoggerRule extends ExternalResource
{
  private Appender appender;
  private String name;
  private Level originalLevel;


  public LoggerRule(Class clazz)
  {
    this(clazz.getName());
  }


  public LoggerRule(String name)
  {
    this.name = name;
  }


  public void verifyLoggingEventNever()
  {
    verifyLoggingEvent(never());
  }


  public void verifyLoggingEventNever(Level level)
  {
    List events = verifyLoggingEventsWithFilter(level);

    assertThat(events).hasSize(0);
  }


  public LoggingEvent verifyLoggingEvent(Level level)
  {
    List events = verifyLoggingEventsWithFilter(level);

    assertThat(events).hasSize(1);

    return events.get(0);
  }


  public List verifyLoggingEvents(Level level)
  {
    List events = verifyLoggingEventsWithFilter(level);

    assertThat(events.size()).isGreaterThanOrEqualTo(1);

    return events;
  }


  public List verifyLoggingEvents(Level level, int wantedNumberOfInvocations)
  {
    List events = verifyLoggingEventsWithFilter(level);

    assertThat(events.size()).isEqualTo(wantedNumberOfInvocations);

    return events;
  }


  private List verifyLoggingEventsWithFilter(Level level)
  {
    List events = verifyLoggingEvents();
    events = filter(events, level);

    return events;
  }


  private static List filter(List events, Level level)
  {
    return events.stream().filter(evt -> evt.getLevel().equals(level)).collect(Collectors.toList());
  }


  public LoggingEvent verifyLoggingEvent()
  {
    return verifyLoggingEvent(times(1)).getValue();
  }


  public List verifyLoggingEvents()
  {
    return verifyLoggingEvent(atLeastOnce()).getAllValues();
  }


  public List verifyLoggingEvents(VerificationMode mode)
  {
    return verifyLoggingEvent(mode).getAllValues();
  }


  private ArgumentCaptor verifyLoggingEvent(VerificationMode mode)
  {
    ArgumentCaptor captor = ArgumentCaptor.forClass(LoggingEvent.class);
    verify(getAppender(), mode).doAppend(captor.capture());

    return captor;
  }


  public Appender getAppender()
  {
    return appender;
  }


  @Override
  protected void before() throws Throwable
  {
    appender = mock(Appender.class);

    getLogger().addAppender(appender);

    originalLevel = getLogger().getLevel();
    getLogger().setLevel(Level.ALL);
  }


  @Override
  protected void after()
  {
    getLogger().removeAppender(appender);
    getLogger().setLevel(originalLevel);
  }


  public void withLevel(Level level)
  {
    getLogger().setLevel(level);
  }


  private Logger getLogger()
  {
    return LogManager.getLogger(name);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy