在 Java 中测试 Logger(如 java.util.logging.Logger、Log4j、SLF4J 等),通常有几种常见做法,取决于你使用的日志框架和测试目标(验证是否打了日志 / 验证日志内容)。
下面按常见场景给你总结。
java.util.logging.LoggerHandler 捕获日志(推荐)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());
}
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());
}
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 logger;
@Test
public void test() {
new MyClass(logger).doWork();
verify(logger).info("work done");
}
⚠️ 一般不推荐 mock Logger(耦合实现)
✅ 推荐
❌ 不推荐
我可以直接给你可运行的测试代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。