我有一些正在测试的代码,它们呼吁Java记录器报告其状态。在JUnit测试代码中,我想验证是否在此记录器中输入了正确的日志条目。遵循以下内容:
methodUnderTest(bool x){ if(x) logger.info("x happened") } @Test tester(){ // perhaps setup a logger first. methodUnderTest(true); assertXXXXXX(loggedLevel(),Level.INFO); }
我想可以用专门改编的记录器(或处理程序或格式化程序)来完成此操作,但我希望重用已存在的解决方案。(而且,老实说,我不清楚如何从记录器中获取logRecord,但是假设这是可能的。)
我也需要几次。我在下面整理了一个小样本,你可以根据需要进行调整。基本上,你可以创建自己的Appender并将其添加到所需的记录器中。如果你想收集所有内容,那么根记录器是一个很好的起点,但是如果你愿意,可以使用更具体的信息。完成后,请不要忘记删除Appender,否则可能会导致内存泄漏。下面,我在测试中完成了此操作,但根据你的需要,setUp或者@Before和/ tearDown或@After可能是更好的地方。
Appender
@Before
/ tearDown
@After
同样,下面的实现将所有内容收集到一个List内存中。如果记录很多,你可能会考虑添加一个过滤器以删除无聊的条目,或将日志写入磁盘上的临时文件(提示:LoggingEventis Serializable,因此,如果你的日志消息是,则应该能够序列化事件对象是。)
LoggingEventis Serializable
import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; public class MyTest { @Test public void test() { final TestAppender appender = new TestAppender(); final Logger logger = Logger.getRootLogger(); logger.addAppender(appender); try { Logger.getLogger(MyTest.class).info("Test"); } finally { logger.removeAppender(appender); } final List<LoggingEvent> log = appender.getLog(); final LoggingEvent firstLogEntry = log.get(0); assertThat(firstLogEntry.getLevel(), is(Level.INFO)); assertThat((String) firstLogEntry.getMessage(), is("Test")); assertThat(firstLogEntry.getLoggerName(), is("MyTest")); } } class TestAppender extends AppenderSkeleton { private final List<LoggingEvent> log = new ArrayList<LoggingEvent>(); @Override public boolean requiresLayout() { return false; } @Override protected void append(final LoggingEvent loggingEvent) { log.add(loggingEvent); } @Override public void close() { } public List<LoggingEvent> getLog() { return new ArrayList<LoggingEvent>(log); } }