2017-02-07 21 views
1

У меня есть класс, в котором я беру все свои свойства и скрываю их пароли перед протоколированием.Log4j2 Mock Appender

@Override 
public void afterPropertiesSet() throws Exception { 
    Properties loadedProperties = this.mergeProperties(); 
    loadedProperties.entrySet().stream().forEach(singleProperty -> { 
     String key = singleProperty.getKey().toString(); 
     String value = HIDDEN_VALUE; 

     if (!Arrays.stream(PASSWORD_PATTERNS).anyMatch(pattern -> key.toLowerCase().contains(pattern))) { 
      value = singleProperty.getValue().toString();     
     } 

     logger.info("LoadedProperty: "+ key +"=" + value); 
    }); 
} 

Я мигрировал в log4j2 и хотел бы проверить этот класс, просмотрев вывод log4j2. В настоящее время она использует log4j и работает, однако, когда я мигрировал в log4j2, я получаю

Wanted, но не вызывается: mockAppender.append(); -> в com.comp.spmConf.ExceptionLoggerTest.verifyErrorMessages (ExceptionLoggerTest.java:87)

Тем не менее, существуют и другие взаимодействия с этим макетом: mockAppender.getName(); -> в org.apache.logging.log4j.core.config.AbstractConfiguration.addLoggerAppender (AbstractConfiguration.java:675)

mockAppender.getName(); . -> в org.apache.logging.log4j.core.config.AppenderControl (AppenderControl.java:51)

Вот мой log4j1 тестовый класс:

import org.apache.log4j.Appender; 
import org.apache.log4j.LogManager; 
import org.apache.log4j.spi.LoggingEvent; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.ArgumentCaptor; 
import org.mockito.Captor; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.runners.MockitoJUnitRunner; 

import java.util.Properties; 

@RunWith(MockitoJUnitRunner.class) 
public class SpmPropertyTracerTest { 

@Mock 
private Appender appenderMock; 

@Captor 
private ArgumentCaptor captorLoggingEvent; 

private SpmPropertyTracer tracer; 

@Before 
public void setup() { 
    LogManager.getRootLogger().addAppender(appenderMock); 
    tracer = new SpmPropertyTracer(); 
} 

@After 
public void teardown() { 
    LogManager.getRootLogger().removeAppender(appenderMock); 
} 

@Test 
public void printPropertiesTest() throws Exception{ 
    String key1 = "Foo"; 
    String val1 = "True"; 
    Properties properties = new Properties(); 
    properties.setProperty(key1, val1); 
    tracer.setProperties(properties); 
    String expectedString = String.format("LoadedProperty: %s=%s", key1, val1); 
    tracer.afterPropertiesSet(); 
    Mockito.verify(appenderMock).doAppend((LoggingEvent)captorLoggingEvent.capture()); 
    LoggingEvent loggingEvent = (LoggingEvent) captorLoggingEvent.getValue(); 
    assert expectedString.equals(loggingEvent.getRenderedMessage()); 
} 

} 

А вот мой log4j2 test class, я делаю что-то неправильно в log4j для миграции log4j2?

import org.apache.logging.log4j.Level; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.core.Appender; 
import org.apache.logging.log4j.core.LogEvent; 
import org.apache.logging.log4j.core.Logger; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.ArgumentCaptor; 
import org.mockito.Captor; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

import java.util.Properties; 

import static org.junit.Assert.assertEquals; 
import static org.mockito.Mockito.*; 



@RunWith(MockitoJUnitRunner.class) 
public class TestClass { 
@Mock 
private Appender mockAppender; 
@Captor 
private ArgumentCaptor<LogEvent> captorLoggingEvent; 

private SpmPropertyTracer tracer; 

private Logger logger; 

private LogEvent logEvent; 

@Before 
public void setup() { 
    // prepare the appender so Log4j likes it 
    when(mockAppender.getName()).thenReturn("MockAppender"); 
    when(mockAppender.isStarted()).thenReturn(true); 
    when(mockAppender.isStopped()).thenReturn(false); 

    logger = (Logger)LogManager.getLogger(SpmPropertyTracer.class); 
    logger.addAppender(mockAppender); 
    logger.setLevel(Level.INFO); 

    tracer = new SpmPropertyTracer(); 
} 

@After 
public void tearDown() { 
    // the appender we added will sit in the singleton logger forever 
    // slowing future things down - so remove it 
    logger.removeAppender(mockAppender); 
} 

@Test 
public void loggingIsCaptured() throws Exception { 
    String key1 = "Foo"; 
    String val1 = "True"; 
    Properties properties = new Properties(); 
    properties.setProperty(key1, val1); 
    tracer.setProperties(properties); 
    String expectedString = String.format("LoadedProperasdfty: %s=%s", key1, val1); 
    tracer.afterPropertiesSet(); 
    verifyErrorMessages(expectedString); 
} 


// handy function to inspect the messages sent to the logger 
private void verifyErrorMessages(String ... messages) { 
    verify(mockAppender, times(messages.length)).append((LogEvent)captorLoggingEvent.capture()); 

    int i=0; 
    for(LogEvent loggingEvent:captorLoggingEvent.getAllValues()) { 
     assertEquals(messages[i++], loggingEvent.getMessage().getFormattedMessage()); 
    } 
} 

ответ

0

Родительский проект был засаливание в log4j зависимости, таким образом, был SLF4J связывания с log4j и не log4j2, и именно поэтому метод Append не был вызван. Удаление этой зависимости исправило мои ошибки.