1. 程式人生 > >Junit測試用例配置Log4j

Junit測試用例配置Log4j

用Junit測試非常方便,但有時我們想要看日誌來方便排除,使用spring+log4j時,用Junit測試看日誌很多人都不太會,即如何將Junit與log4j進行整合。

我也是研究了半天,才終於找到了方法,特此拿來與大家分享下。

Junit+spring+log4j整合之所以麻煩,是因為spring與log4j的整合,是放在web.xml裡的,隨tomcat啟動後,spring才會載入log4j,而用junit測試是不需要tomcat啟動的,所以Junit與log4j的整合才比較費勁。Junit使用spring時,若spring沒載入到log4j就會報以下警告!

  1. log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).  
  2. log4j:WARN Please initialize the log4j system properly.  
  3. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.  

1. 最簡單最笨的方法

將log4j放到src根目錄下,這是由於spring載入log4j預設從src目錄裡找。Junit程式碼如下:

  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = { "classpath:com/config/springConfig.xml"
     })  
  3. @Transactional
  4. @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
  5. publicclass TestHibernate {  
  6. ...  
  7. }  

這種方法,雖然直接簡單,但很多專案中喜歡把所有配置檔案進行統一管理並分類彙總到不同的資料夾下,例如:將所有配置檔案放到com.config包下。那麼測試的時候就還得手動將log4j.properties或log4j.xml移動到根目錄下,但這麼做,專案簡單還行,如果是大型專案,需要載入很多配置檔案時,還是恨麻煩也容易出問題的。因此並不推薦。

2. 推薦方法

新建JUnit4ClassRunner類。Junit程式碼如下:

  1. publicclass JUnit4ClassRunner extends SpringJUnit4ClassRunner {  
  2.     static {  
  3.         try {  
  4.             Log4jConfigurer.initLogging("classpath:com/config/log4j.properties");  
  5.         } catch (FileNotFoundException ex) {  
  6.             System.err.println("Cannot Initialize log4j");  
  7.         }  
  8.     }  
  9.     public JUnit4ClassRunner(Class<?> clazz) throws InitializationError {  
  10.         super(clazz);  
  11.     }  
  12. }  
  1. @RunWith(JUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = "classpath:com/config/springConfig.xml")  
  3. @Transactional
  4. @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
  5. publicclass TestHibernate {  
  6. ...  
  7. }  

這樣,在啟動Junit測試時,spring就會載入log4j了。而且保持了靈活性。

PS:Junit載入spring的runner(SpringJUnit4ClassRunner)要優先於spring載入log4j,因此採用普通方法,無法實現spring先載入log4j後被Junit載入。所以我們需要新建JUnit4ClassRunner類,修改SpringJUnit4ClassRunner載入log4j的策略。這樣載入log4j就會優先於載入spring了。