差異處
這裏顯示兩個版本的差異處。
java:junit:tech:capture_log4j_output [2018/04/11 23:32] tony |
java:junit:tech:capture_log4j_output [2023/06/25 09:48] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | {{tag>junit}} | ||
- | ====== How to verify the Log4j output? ====== | ||
- | ===== Problem ===== | ||
- | 當功能的測試案例寫完後,就是要開始針對較特殊的案例撰寫單元測試。log錯誤是一種錯誤回報的例外處理機制,而單元測試中,我們該如何捕捉到這些透過log回報的錯誤呢?\\ | ||
- | \\ | ||
- | Log4j可以透過ConsoleAppender將訊息給顯示到console上,[[java:junit:tech:capture_systemout|先前文章]]也分享過驗證console內容的方法;然而我們不希望使用者看到這些內容,所以預設的log4j設定檔是不使用ConsoleAppender。\\ | ||
- | \\ | ||
- | 如果針對測試提供不同的log4j設定檔,也不是那麼的方便,因此我分享給大家另外一種方法,可以將Log4j訊息導到StringBuffer中以做驗證。 | ||
- | ===== How to? ===== | ||
- | <code java> | ||
- | 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); | ||
- | } | ||
- | </code> | ||
- | |||
- | <code java> | ||
- | @After | ||
- | public void teardown() throws SchedulerException{ | ||
- | LogManager.getLogger(TimeWatcherBuilder.class).removeAppender(mTestAppender); | ||
- | } | ||
- | </code> | ||
- | ===== Reference ===== | ||
- | * [[https://stackoverflow.com/questions/6995946/log4j-how-do-i-redirect-an-outputstream-or-writer-to-loggers-writers|How to redirect the outputstream or writer to loggers writers?]] | ||
- | |||
- | ===== ===== | ||
- | ---- | ||
- | \\ | ||
- | ~~DISQUS~~ |