2015-10-07 116 views
1

我想单元测试在我的代码中生成的日志语句。我正在使用slfj,log4j和Mockito。我现在用的是类似的代码如下从博客在 http://bloodredsun.com/2010/12/09/checking-logging-in-unit-tests/运行单元测试时未调用Mockito模拟log4j appender

当我运行它抛出异常的测试说,有0调用在行:

verify(mockAppender).doAppend(captorLoggingEvent.capture());

错误消息

通缉但未调用:mockAppender.doAppend(); - > at 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

可以ü请给出错误日志 –

+0

@AbdulManaf:我已更新错误消息。 –

+0

@JohnLiva:你能告诉我们什么是ExampleThatLogs吗?它如何初始化其Logger? – TobiSH

回答

1

我试图模仿你的情况,在我结束它做工精细

//登录的Util

 public class LogUtil{ 

     final static Logger logger = Logger.getLogger(LogUtil.class); 

     public static Log`enter code here`ger getLogger() 
     { 
      return logger; 
     } 

//类

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(); 
    } 
} 
0

我知道这有些过时,但我也在为此而苦苦挣扎。我在被测试的类中的DEBUG级别上记录了语句。我在logback.xml中为被测试的类配置了INFO。将我的日志语句更改为INFO允许测试通过。另外,我还读了this Github帖子,它非常简洁并且测试日志输出的干净实现。希望别人会发现它有用。