您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Java 如何在记录器中对消息执行JUnit断言

Java 如何在记录器中对消息执行JUnit断言

我也需要几次。我在下面整理了一个小样本,你可以根据需要进行调整。基本上,你可以创建自己的Appender并将其添加到所需的记录器中。如果你想收集所有内容,那么根记录器是一个很好的起点,但是如果你愿意,可以使用更具体的信息。完成后,请不要忘记删除Appender,否则可能会导致内存泄漏。下面,我在测试中完成了此操作,但根据你的需要,setUp或者@Before/ tearDown@After可能是更好的地方。

同样,下面的实现将所有内容收集到一个List内存中。如果记录很多,你可能会考虑添加一个过滤器以删除无聊的条目,或将日志写入磁盘上的临时文件提示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);
    }
}
java 2022/1/1 18:17:19 有570人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶