差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

下次修改
前次修改
java:junit:tech:capture_log4j_output [2018/04/10 14:18]
tony 建立
java:junit:tech:capture_log4j_output [2023/06/25 09:48] (目前版本)
行 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 =====