2015-02-09 84 views

回答

3

我建议看看log4j2中的JUnit测试。

许多log4j2单元测试使用带有immediateFlush = true的FileAppender,然后读入文件并检查输出中是否存在预期的字符串。其他人配置一个(org.apache.logging.log4j.test.appender。)ListAppender(该类位于核心测试jar中),并直接从列表中获取LogEvent对象。

您可能需要为log4j2 JUnit测试分叉一个新进程,以确保某个先前进程尚未加载不同的配置。

+0

谢谢。我会照你的建议去做。 – EdwinF 2015-02-10 15:29:59

0

一种选择是使用自定义的OutputStreamAppender子类将记录器配置为写入内存字符串(字节数组),您必须编写该子类。

然后,您可以在测试中对结果字符串使用断言。

我最近做了一个关于做这个here的博文。也许它会帮助你。

+0

谢谢,我来看看。 – EdwinF 2015-02-23 13:25:26

+0

@EdwinF很酷。我很快写了这篇文章,所以我希望它有道理:P – rewolf 2015-02-23 14:11:42

4

在这里,你有我在我的一个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); 
    } 
} 

在您的测试案例中,您可以检查写入的消息数量或包含所需消息的列表。

+1

什么是InterceptedComponent? – 2017-04-03 12:27:28

相关问题