我已经创建了一些自定义记录器,其中一些级别覆盖了Log4J2中的自定义记录器。我按照指南http://logging.apache.org/log4j/2.x/manual/customloglevels.html。如何在log4j2中为自定义记录器编写单元测试
我需要创建一些单元测试来验证事件是否正在正确的自定义级别和配置上注册。
我很欣赏任何有关如何开始的提示。非常感谢。
我已经创建了一些自定义记录器,其中一些级别覆盖了Log4J2中的自定义记录器。我按照指南http://logging.apache.org/log4j/2.x/manual/customloglevels.html。如何在log4j2中为自定义记录器编写单元测试
我需要创建一些单元测试来验证事件是否正在正确的自定义级别和配置上注册。
我很欣赏任何有关如何开始的提示。非常感谢。
我建议看看log4j2中的JUnit测试。
许多log4j2单元测试使用带有immediateFlush = true的FileAppender,然后读入文件并检查输出中是否存在预期的字符串。其他人配置一个(org.apache.logging.log4j.test.appender。)ListAppender(该类位于核心测试jar中),并直接从列表中获取LogEvent对象。
您可能需要为log4j2 JUnit测试分叉一个新进程,以确保某个先前进程尚未加载不同的配置。
在这里,你有我在我的一个JUnit测试中所做的。
1-创建一个自定义appender,在内存中保存消息列表。
package com.example.appender;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.layout.PatternLayout;
/**
* @author carrad
*
*/
@Plugin(name = "TestAppender", category = "Core", elementType = "apender", printObject = true)
public class TestAppender extends AbstractAppender {
private static final long serialVersionUID = 8047713135100613185L;
private List<String> messages = new ArrayList<String>();
protected TestAppender(String name, Filter filter, Layout<? extends Serializable> layout) {
super(name, filter, layout);
}
@Override
public void append(LogEvent event) {
getMessages().add(event.getMessage().toString());
}
@PluginFactory
public static TestAppender createAppender(@PluginAttribute("name") String name,
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginElement("Filter") final Filter filter,
@PluginAttribute("otherAttribute") String otherAttribute) {
if (name == null) {
LOGGER.error("No name provided for TestAppender");
return null;
}
if (layout == null) {
layout = PatternLayout.createDefaultLayout();
}
return new TestAppender(name, filter, layout);
}
public List<String> getMessages() {
return messages;
}
public void setMessages(List<String> messages) {
this.messages = messages;
}
}
2-附加器添加到log42-的test.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="com.example.appender">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<TestAppender name="TestAppender" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</TestAppender>
</Appenders>
<Loggers>
<Logger name="com.example" level="All" />
<Root>
<AppenderRef ref="Console" level="All" />
<AppenderRef ref="TestAppender" level="All" />
</Root>
</Loggers>
</Configuration>
3-获取在JUnit测试的附加器的参考。
public class LoggingInterceptorTest {
@Autowired
private InterceptedComponent helperComponent;
private TestAppender appender;
@Before
public void setUp() {
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
appender = (TestAppender) config.getAppenders().get("TestAppender");
}
@Test
public void test_wrapping() {
helperComponent.doStuff("437");
Assert.assertEquals(appender.getMessages().size(), 2);
}
}
在您的测试案例中,您可以检查写入的消息数量或包含所需消息的列表。
什么是InterceptedComponent? – 2017-04-03 12:27:28
谢谢。我会照你的建议去做。 – EdwinF 2015-02-10 15:29:59