[英]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時,我得到了
通緝但未調用:mockAppender.append(); - > at com.comp.spmConf.ExceptionLoggerTest.verifyErrorMessages(ExceptionLoggerTest.java:87)
但是,這個模擬還有其他交互:mockAppender.getName(); - > at org.apache.logging.log4j.core.config.AbstractConfiguration.addLoggerAppender(AbstractConfiguration.java:675)
mockAppender.getName(); - > at 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測試類,我在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());
}
}
父項目依賴於log4j依賴項,因此slf4j與log4j綁定而不是log4j2,這就是為什么沒有調用append方法。 刪除該依賴項修復了我的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.