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就會報以下警告!

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放到src根目錄下,這是由於spring加載log4j默認從src目錄裏找。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類。Junit代碼如下:

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了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章