2015-10-07 86 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帖子,它非常簡潔並且測試日誌輸出的乾淨實現。希望別人會發現它有用。