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