log4j是否有一个appender,只存储日志事件的列表(用于单元测试,以验证没有错误日志被写入)?
有一个 MemoryAppender但它不是标准log4j库的一部分。
你可以很容易地写你自己的,但是如果你只用它们来进行单元测试,我可能会模拟Logger,并断言没有对它进行调用。在目标类中重写getLogger()方法,或者直接在类型上设置模拟Logger。
用的是Jmock(记忆中的例子,有错误请见谅)。
public void testDoFoo() {
Mockery mockery = new Mockery();
Logger mockLogger = mockery.mock(Logger.class);
Foo foo = new Foo();
foo.setLogger(mockLogger);
mockery.checking(new Expectations() {
{
never(mockLogger).debug(with(any(String.class));
}
};
...
//do the actual test.
//assert the mock type has never been called.
mockery.assertIsSatisfied();
}
我不相信有。不过你可以很容易的写出自己的。这里有一个 适当的教程.
这是一个记录器appender的例子,它将所有的事件存储在内存中(在一个叫 "记录器 "的地方)。StringBuilder
); 然后可以用 getResult
:
package apackage;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
/**
* Records logging events in a String.
*
* @author Lorenzo Bettini
*
*/
public class InMemoryLoggerAppender extends AppenderSkeleton {
private StringBuilder builder = new StringBuilder();
@Override
public void close() {
// nothing to close
}
@Override
public boolean requiresLayout() {
return false;
}
@Override
protected void append(LoggingEvent event) {
builder.append(
event.getLevel() + ": " + event.getMessage().toString()
+ System.lineSeparator());
}
public String getResult() {
return builder.toString();
}
}
然后,您必须将此附加器添加到现有的 Logger
例如(MyClass
是使用 Logger
以记录您要捕捉的事件)。)
InMemoryLoggerAppender appender = new InMemoryLoggerAppender();
Logger log = Logger.getLogger(MyClass.class);
log.addAppender(appender);