Junit與log4j的整合問題

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

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

解決辦法1:最簡單粗暴的方法

將log4j放到特定目錄下,指定加載配置文件位置。Junit代碼如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:com/config/springConfig.xml" })
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class TestHibernate {
    ...
}

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

解決辦法2:推薦方法

新建JUnit4ClassRunner類:

public class JUnit4ClassRunner extends SpringJUnit4ClassRunner {
    static {
      try {
        Log4jConfigurer.initLogging("classpath:com/config/log4j.properties");
      } catch (FileNotFoundException ex) {
        System.err.println("Cannot Initialize log4j");
      }
    }
    public JUnit4ClassRunner(Class<?> clazz) throws InitializationError {
      super(clazz);
    }
  }

引用此類:

@RunWith(JUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:com/config/springConfig.xml")
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class TestHibernate {
    ...
}

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

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

發佈了32 篇原創文章 · 獲贊 143 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章