Junit单元测试使用log4j输出日志
2015-06-15 17:17
225 查看
Junit+spring+log4j整合之所以麻烦,是因为spring与log4j的整合,是放在web.xml里的,随tomcat启动后,spring才会加载log4j,而用junit测试是不需要tomcat启动的,所以Junit与log4j的整合才比较费劲。Junit使用spring时,若spring没加载到log4j就会报以下警告:
解决办法1:最简单粗暴的方法
将log4j放到特定目录下,指定加载配置文件位置。Junit代码如下:
这种方法,虽然直接简单,但很多项目中喜欢把所有配置文件进行统一管理并分类汇总到不同的文件夹下,例如:将所有配置文件放到com.config包下。那么测试的时候就还得手动将log4j.properties或log4j.xml移动到根目录下,但这么做,项目简单还行,如果是大型项目,需要加载很多配置文件时,还是恨麻烦也容易出问题的。因此并不推荐。
解决办法2:推荐方法
新建JUnit4ClassRunner类:
引用此类:
这样,在启动Junit测试时,spring就会加载log4j了。而且保持了灵活性。
PS:Junit加载spring的runner(SpringJUnit4ClassRunner)要优先于spring加载log4j,因此采用普通方法,无法实现spring先加载log4j后被Junit加载。所以我们需要新建JUnit4ClassRunner类,修改SpringJUnit4ClassRunner加载log4j的策略。这样加载log4j就会优先于加载spring了。
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了。
相关文章推荐
- 重载重写重定义-易混淆概念-C++编译器处理方式
- 9. 工作区和暂存区
- 重载重写重定义-易混淆概念-C++编译器处理方式
- c/s与b/s的区别
- Java Google Json (Gson) Serializing Inner classes
- saltstack
- 纪念csdn博客今天正式开通
- ASP.NET MVC导入excel到数据库
- GRE填空备考建议
- PullToRefresh实现刷新加载
- 使用枚举类型的值创建枚举类型
- javascrip应用
- linux多线程编程(五)
- linux下tinyxml开发入门
- Windchill设置当前用户为管理员
- ERP--甘特图案例
- myeclipse工作空间开不开怎么办
- 用STRACE解决公司真实故障一例
- GRE填空考试时间
- 黑马程序员_面向对象