差異處
這裏顯示兩個版本的差異處。
下次修改 | 前次修改 | ||
java:junit:tech:capture_log4j_output [2018/04/10 14:18] tony 建立 |
java:junit:tech:capture_log4j_output [2018/04/11 23:37] tony |
||
---|---|---|---|
行 2: | 行 2: | ||
====== How to verify the Log4j output? ====== | ====== How to verify the Log4j output? ====== | ||
===== Problem ===== | ===== Problem ===== | ||
+ | 當功能的測試案例寫完後,就是要開始針對較特殊的案例撰寫單元測試。log錯誤是一種錯誤回報的例外處理機制,而單元測試中,我們該如何捕捉到這些透過log回報的錯誤呢?\\ | ||
+ | \\ | ||
+ | Log4j可以透過ConsoleAppender將訊息給顯示到console上,[[java:junit:tech:capture_systemout|先前文章]]也分享過驗證console內容的方法;然而我們不希望使用者看到這些內容,所以預設的log4j設定檔是不使用ConsoleAppender。\\ | ||
+ | \\ | ||
+ | 如果針對測試提供不同的log4j設定檔,也不是那麼的方便,因此我分享給大家另外一種方法,可以將Log4j訊息導到StringBuffer中以做驗證。 | ||
===== How to? ===== | ===== How to? ===== | ||
+ | 主要技巧是透過LogManager在測試之前加入WriterAppender,而WriterAppender會使用我給予的OutputStreamWriter: | ||
<code java> | <code java> | ||
- | private StringBuffer mSB; | + | private StringBuffer mSB; |
- | private StringBufferOutputStream mSBOutputStream; | + | private StringBufferOutputStream mSBOutputStream; |
- | private WriterAppender testAppender; | + | private WriterAppender mTestAppender; |
- | @Before | + | @Before |
- | public void setUp() throws Exception { | + | public void setUp() throws Exception { |
- | mSB = new StringBuffer(); | + | mSB = new StringBuffer(); |
- | mSBOutputStream = new StringBufferOutputStream(mSB); | + | mSBOutputStream = new StringBufferOutputStream(mSB); |
- | + | ||
- | Writer w = new OutputStreamWriter(mSBOutputStream); | + | |
- | testAppender = new WriterAppender(); | + | |
- | testAppender.setLayout(new PatternLayout(PatternLayout.DEFAULT_CONVERSION_PATTERN)); | + | |
- | testAppender.setName("test"); | + | |
- | testAppender.activateOptions(); | + | |
- | testAppender.setWriter(w); | + | |
- | + | ||
- | LogManager.getLogger(TimeWatcherBuilder.class).addAppender(testAppender); | + | |
- | } | + | |
- | </code> | + | |
+ | 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> | ||
+ | 當待測程式碼使用了log4j,就會透過OutputStreamWriter將內容寫入[[java:junit:tech:capture_systemout|StringBufferOutputStream]],而StringBufferOutputStream內部有一個StringBuffer記載內容以供之後驗證。\\ | ||
+ | \\ | ||
+ | 當測試之後,不能忘記移除測試用的Appender: | ||
<code java> | <code java> | ||
- | @After | + | @After |
- | public void teardown() throws SchedulerException{ | + | public void teardown() throws SchedulerException{ |
- | LogManager.getLogger(TimeWatcherBuilder.class).removeAppender(testAppender); | + | LogManager.getLogger(TimeWatcherBuilder.class).removeAppender(mTestAppender); |
- | } | + | } |
</code> | </code> | ||
===== Reference ===== | ===== Reference ===== |