How to verify the Log4j output?

當功能的測試案例寫完後,就是要開始針對較特殊的案例撰寫單元測試。log錯誤是一種錯誤回報的例外處理機制,而單元測試中,我們該如何捕捉到這些透過log回報的錯誤呢?

Log4j可以透過ConsoleAppender將訊息給顯示到console上,先前文章也分享過驗證console內容的方法;然而我們不希望使用者看到這些內容,所以預設的log4j設定檔是不使用ConsoleAppender。

如果針對測試提供不同的log4j設定檔,也不是那麼的方便,因此我分享給大家另外一種方法,可以將Log4j訊息導到StringBuffer中以做驗證。

主要技巧是透過LogManager在測試之前加入WriterAppender,而WriterAppender會使用我給予的OutputStreamWriter:

private StringBuffer mSB;
private StringBufferOutputStream mSBOutputStream;
private WriterAppender mTestAppender;
 
@Before
public void setUp() throws Exception {
	mSB = new StringBuffer();
	mSBOutputStream =  new StringBufferOutputStream(mSB);
 
	Writer w = new OutputStreamWriter(mSBOutputStream);
	mTestAppender= new WriterAppender();
	mTestAppender.setLayout(new PatternLayout(PatternLayout.DEFAULT_CONVERSION_PATTERN));
	mTestAppender.setName("test");
	mTestAppender.activateOptions();
	mTestAppender.setWriter(w);
 
	LogManager.getLogger(TimeWatcherBuilder.class).addAppender(mTestAppender);
}

當待測程式碼使用了log4j,就會透過OutputStreamWriter將內容寫入StringBufferOutputStream,而StringBufferOutputStream內部有一個StringBuffer記載內容以供之後驗證。

當測試之後,不能忘記移除測試用的Appender:

@After
public void teardown() throws SchedulerException{
	LogManager.getLogger(TimeWatcherBuilder.class).removeAppender(mTestAppender);
}