Java Log4j2:Junit测试用例失败

Java Log4j2:Junit测试用例失败,java,junit4,log4j2,Java,Junit4,Log4j2,我正在为log4j2记录器编写JUnit测试用例,如下所示 import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.After; i

我正在为log4j2记录器编写JUnit测试用例,如下所示

import static org.junit.Assert.assertTrue;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class SampleLoggerTest {
    private ByteArrayOutputStream outContent = new ByteArrayOutputStream();
    private Logger logger = null;
    private PrintStream sysOut = System.out;

    @Before
    public void setUpStreams() {
        System.setOut(new PrintStream(outContent));
        logger = LogManager.getLogger(SampleLoggerTest.class);
    }

    @After
    public void restoreStreams() {
        System.setOut(sysOut);
    }

    @Test
    public void error() {
        logger.error("OnLogger");
        assertTrue(outContent.toString().contains("error"));
    }

    @Test
    public void debug() {
        logger.debug("OnLogger");
        assertTrue(outContent.toString().contains("debug"));
    }

    @Test
    public void fatal() {
        logger.fatal("OnLogger");
        assertTrue(outContent.toString().contains("fatal"));
    }

    @Test
    public void info() {
        logger.info("OnLogger");
        assertTrue(outContent.toString().contains("info"));
    }

    @Test
    public void warn() {
        logger.warn("OnLogger");
        assertTrue(outContent.toString().contains("warn"));
    }

    @Test
    public void trace() {
        logger.trace("OnLogger");
        assertTrue(outContent.toString().contains("trace"));
    }
}
但是只有一个测试用例是成功的,那就是,
info()
我发现
outContent
包含第一个测试用例的log语句,它是
info()
,它是成功的,但是对于其余的测试用例
outContent
是空白的

我尝试在
restoreStreams()
中刷新/关闭流,但没有成功,我还检查了控制台输出,所有内容都被打印出来了,因为我一直将日志记录到
跟踪

有人能帮我找到我在这件事上遗漏了什么吗

以下是控制台输出:

2018-04-19 11:53:31.636 INFO [main] [com.logger.SampleLoggerTest] [info] [com.logger.SampleLoggerTest.info(SampleLoggerTest.java:60)] - logger
2018-04-19 11:54:39.197 WARN [main] [com.logger.SampleLoggerTest] [warn] [com.logger.SampleLoggerTest.warn(SampleLoggerTest.java:69)] - logger
2018-04-19 11:54:41.790 DEBUG [main] [com.logger.SampleLoggerTest] [debug] [com.logger.SampleLoggerTest.debug(SampleLoggerTest.java:42)] - logger
2018-04-19 11:54:43.966 ERROR [main] [com.logger.SampleLoggerTest] [error] [com.logger.SampleLoggerTest.error(SampleLoggerTest.java:33)] - logger
2018-04-19 11:54:46.254 FATAL [main] [com.logger.SampleLoggerTest] [fatal] [com.logger.SampleLoggerTest.fatal(SampleLoggerTest.java:51)] - logger
2018-04-19 11:54:48.309 TRACE [main] [com.logger.SampleLoggerTest] [trace] [com.logger.SampleLoggerTest.trace(SampleLoggerTest.java:78)] - logger

log4j只初始化一次,因此
@Before
@After
-方法不会影响Log4J2

SampleLoggerTest
中的另一个问题是
ByteArrayOutputStream
,它在创建
SampleLoggerTest
-类的实例时初始化一次,并且在第二次调用
@Before
-方法时可能会关闭

以下代码适用于我:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

public class SampleLoggerTest {
    private static ByteArrayOutputStream outContent;
    private static Logger logger = null;
    private static PrintStream printStream;

    @BeforeClass
    public static void init() {
        SampleLoggerTest.outContent = new ByteArrayOutputStream();
        SampleLoggerTest.printStream = new PrintStream(SampleLoggerTest.outContent);
        System.setOut(SampleLoggerTest.printStream);
        SampleLoggerTest.logger = LogManager.getLogger(SampleLoggerTest.class);
    }

    @Test
    public void debug() {
        SampleLoggerTest.logger.debug("OnLogger");
        Assert.assertTrue(SampleLoggerTest.outContent.toString().contains("DEBUG"));
    }

    @Test
    public void error() {
        SampleLoggerTest.logger.error("OnLogger");
        Assert.assertTrue(SampleLoggerTest.outContent.toString().contains("ERROR"));
    }

    @Test
    public void fatal() {
        SampleLoggerTest.logger.fatal("OnLogger");
        Assert.assertTrue(SampleLoggerTest.outContent.toString().contains("FATAL"));
    }

    @Test
    public void info() {
        SampleLoggerTest.logger.info("OnLogger");
        Assert.assertTrue(SampleLoggerTest.outContent.toString().contains("INFO"));
    }

    @Test
    public void trace() {
        SampleLoggerTest.logger.trace("OnLogger");
        Assert.assertTrue(SampleLoggerTest.outContent.toString().contains("TRACE"));
    }

    @Test
    public void warn() {
        SampleLoggerTest.logger.warn("OnLogger");
        Assert.assertTrue(SampleLoggerTest.outContent.toString().contains("WARN"));
    }
}
在执行最后一个
@Test
-方法后,在我的例子中,它的
跟踪
ByteArrayOutputStream
如下所示:

10:44:32.848 [main] INFO  de.crm.tools.SampleLoggerTest - OnLogger
10:44:32.848 [main] WARN  de.crm.tools.SampleLoggerTest - OnLogger
10:44:47.601 [main] DEBUG de.crm.tools.SampleLoggerTest - OnLogger
10:44:47.601 [main] ERROR de.crm.tools.SampleLoggerTest - OnLogger
10:44:47.601 [main] FATAL de.crm.tools.SampleLoggerTest - OnLogger
10:44:47.601 [main] TRACE de.crm.tools.SampleLoggerTest - OnLogger

伟大的很好!谢谢你没有为我打印控制台。必须删除
系统。设置