Juit4 spring testContext 新特性及遇到的问题

来源:互联网 发布:温州炒房团历史知乎 编辑:程序博客网 时间:2024/05/17 02:17

     Junit4搭配spring testContext,对于ssh应用的每个层面都能有效搭建单元测试。现简单记录如下:

 

     用annotation的方式标记测试方法,不需要再继承TestCase父类,灵活度比较高。

     Spring testContext提供了在unit test中读取applicationContext配置文件的方法,只要简单的使用@ContextConfiguration注明配置文件的位置即可,同样可以使用@Autowired就可以引用需要测试或使用的bean。

     对于spring的dao层测试,spring testContext提供了AbstractTransationalJunit4SpringContexTests类,只要继承后,就可以对数据库操作进行单元测试。配合simpleJdbcTemplate(直接引用,父类已经生成好)直接执行sql语句到数据库中抓取数据进行验证。

     特别需要提一下的是,从AbstractTransactionalJunit4SpringContextTest名字看,提供了与事务相关的功能,实际上是提供了事务回滚的功能,这意味着对数据库进行测试之后,所有数据库的数据将保持原状不受测试数据的污染。

     不过,配置也提供了禁止事务回滚的选项,@Rollback(false),如果这样注明的话,对应的数据操作将被写入数据库。

 

     以上是新特性的简单总结,下面讲讲遇到的问题。

 

     在进行数据库测试的时候,因为使用了hibernate,它会对update操作进行延迟操作,做所有其他对数据库操作完成之后,再进行update动作,这样会导致需要验证的sql语句执行完了,被测试的update动作才执行,这种测试是无效的。解决方法就是,在测试类中引用sessionFactory, 在被测试的动作被调用后,直接调用sessionFactory.fulsh(), 强制hibernae提交操作,这样就能得到正确的结果。这样做的另外一个好处就是,不用修改被测试程序本身的逻辑,进而打乱了被测试程序原本的设计。

     在对controller进行测试的时候,会遇到controller引用的bean不能初始化的情况,这时的controller是被直接new出来的,对容器里的bean自然是不可见的,这样就需要对controller进行小小的改动,如果controller是使用annotation的方式引用bean的话,需要改成对应的setXXXX方法,例如原来是

     @Autowired

     private myService ms

 

     改成

     private myService ms

     @Autowired

     public void setMyService(myService ms){

            this.ms=ms

      }

 

     这样在单元测试是就可以通过调用setXXX方法注入容器中的bean,从而是测试顺利运行。