温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Logger 如何测试

发布时间:2026-10-23 16:05:41 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

在 Java 中测试 Logger(如 java.util.logging.Logger、Log4j、SLF4J 等),通常有几种常见做法,取决于你使用的日志框架和测试目标(验证是否打了日志 / 验证日志内容)。

下面按常见场景给你总结。


一、测试 java.util.logging.Logger

方式 1:使用自定义 Handler 捕获日志(推荐)

import java.util.logging.*;
import java.util.List;
import java.util.ArrayList;

public class TestHandler extends Handler {
    public List<LogRecord> records = new ArrayList<>();

    @Override
    public void publish(LogRecord record) {
        records.add(record);
    }

    @Override public void flush() {}
    @Override public void close() {}
}

测试代码:

@Test
public void testLogger() {
    Logger logger = Logger.getLogger("test");
    TestHandler handler = new TestHandler();
    logger.addHandler(handler);
    logger.setLevel(Level.ALL);

    logger.info("hello");

    assertEquals(1, handler.records.size());
    assertEquals("hello", handler.records.get(0).getMessage());
}

二、测试 SLF4J + Logback(最常用)

方式 1:使用 ListAppender(推荐)

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
import org.slf4j.LoggerFactory;

@Test
public void testLog() {
    Logger logger = (Logger) LoggerFactory.getLogger("test");
    ListAppender<ILoggingEvent> appender = new ListAppender<>();
    appender.start();
    logger.addAppender(appender);

    logger.info("test message");

    assertEquals(1, appender.list.size());
    assertEquals("test message", appender.list.get(0).getMessage());
}

三、使用测试库(最简单)

1️⃣ logcaptor(强烈推荐)

Maven

<dependency>
  <groupId>io.github.hakky54</groupId>
  <artifactId>logcaptor</artifactId>
  <version>2.9.0</version>
  <scope>test</scope>
</dependency>

使用示例:

LogCaptor logCaptor = LogCaptor.forClass(MyService.class);

myService.doSomething();

assertTrue(logCaptor.getLogs().contains("expected log"));

✅ 支持 SLF4J / Logback / Log4j2
✅ 零配置
✅ 生产代码无需改


四、测试 Logger 是否被调用(Mock)

如果你只关心“是否调用了 logger”:

@Mock
Logger logger;

@Test
public void test() {
    new MyClass(logger).doWork();
    verify(logger).info("work done");
}

⚠️ 一般不推荐 mock Logger(耦合实现)


五、测试原则建议

✅ 推荐

  • 验证日志内容
  • 使用 ListAppender / LogCaptor
  • 测“关键业务日志”

❌ 不推荐

  • Mock Logger
  • 测日志格式
  • 测框架本身

六、你可以告诉我

  • 用的是什么日志框架(JUL / Log4j / Logback / SLF4J)
  • 单元测试还是集成测试
  • 想验证“是否打印”还是“打印内容”

我可以直接给你可运行的测试代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手