我正在尝试对我的代码中生成的日志语句进行单元测试。我正在使用slfj,log4j和Mockito。我正在使用博客中的类似代码 http://bloodredsun.com/2010/12/09/checking-logging-in-unit-tests/
当我运行测试时,它抛出异常,说明在线上有0个调用:
verify(mockAppender).doAppend(captorLoggingEvent.capture());
错误消息:
想要但未被调用:mockAppender.doAppend(); - >在testClass.testLogAdviceAfterReturning(DpsOpsLoggerTest2.java:94)实际上,这个模拟没有交互。
我看到控制台上印有日志。请求您帮助。
@RunWith(MockitoJUnitRunner.class)
public class ExampleThatLogsTest {
@Mock
private Appender mockAppender;
@Captor
private ArgumentCaptor captorLoggingEvent;
@Before
public void setup() {
LogManager.getRootLogger().addAppender(mockAppender);
}
@After
public void teardown() {
LogManager.getRootLogger().removeAppender(mockAppender);
}
@Test
public void shouldConcatAndLog() {
//given
ExampleThatLogs example = new ExampleThatLogs();
//when
String result = example.concat("foo", "bar");
//then
assertEquals("foobar", result);
verify(mockAppender).doAppend(captorLoggingEvent.capture());
LoggingEvent loggingEvent = captorLoggingEvent.getValue();
//Check log level
assertThat(loggingEvent.getLevel(), is(Level.INFO));
//Check the message being logged
assertThat(loggingEvent.getRenderedMessage(),
is("String a:foo, String b:bar"));
}
}
答案 0 :(得分:1)
我试图模仿你的情况,在我的结尾它工作正常
// Log Util
public class LogUtil{
final static Logger logger = Logger.getLogger(LogUtil.class);
public static Log`enter code here`ger getLogger()
{
return logger;
}
// class
public class RunMe {
public String runMe(String parameter) {
LogUtil.getLogger().info("This is info : " + parameter);
return "In runner " + parameter;
}
}
//单元测试
@RunWith(MockitoJUnitRunner.class)
public class LoggerTest {
@Mock
private Appender mockAppender;
@Captor
private ArgumentCaptor captorLoggingEvent;
@Before
public void setup() {
LogUtil.getLogger().addAppender(mockAppender);
}
@Test
public void shouldConcatAndLog() {
RunMe runner=new RunMe();
String result=runner.runMe("XYZ");
assertEquals("In runner XYZ",result);
verify(mockAppender).doAppend((LoggingEvent) captorLoggingEvent.capture());
LoggingEvent logevent= (LoggingEvent) captorLoggingEvent.getValue();
assertThat(logevent.getLevel(), is(Level.INFO));
}
@After
public void tearDown() {
LogUtil.getLogger().removeAllAppenders();
}
}
答案 1 :(得分:0)
我知道这有点过时,但我也在努力解决这个问题。我正在测试的类中以DEBUG级别记录语句。我在测试中的类的logback.xml中的配置设置为INFO。将我的日志语句更改为INFO允许测试通过。另外,我还阅读了this Github帖子,它非常简洁,是一个测试日志输出的干净实现。希望其他人会觉得它很有用。