注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老陈的博客

非淡泊无以明志,非宁静无以致远,说的是心态!

 
 
 

日志

 
 

使用Spring的测试机制进行单元测试  

2009-12-29 22:45:41|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Spring的Service实现由于需要Spring容器的缘故,因此测试起来比较复杂,本着试试看的原则google下spring单元测试,没想到包罗万象的Spring果然不负众望,提供了一套完整的基于JUnit扩展的测试方案。

其中,spring扩展的测试类包括:ConditionalTestCase、 AbstractSpringContextTests、AbstractSingleSpringContextTests、 AbstractDependencyInjectionSpringContextTests、 AbstractTransactionalSpringContextTests、 AbstractTransactionalDataSourceSpringContextTests,并且按照逐步继承的方式,不断完善各自的功能, 最终可以实现对数据库的持久化数据进行回滚,并且可以直接在测试方法中调用JdbcTemplate查询数据库中数据的功能。

如 果你直接通过扩展TestCase创建测试用例,则所有带test前缀的测试方法都会被毫无例外地执行。而ConditionalTestCase可以让 你在某些情况下,有选择地关闭掉一些测试方法,不让他们在测试用例中执行。这给开发者带来了很大的灵活性,因为他们可以在某次测试中关闭掉一些测试方法, 而仅运行当前特别关注的测试方法,将问题域聚集到一定范围内。如果你要关闭某个测试方法行,仅需实现ConditionalTestCase的 isDisabledInThisEnvironment(String testMethodName)方法就可以了,ConditionalTestCase在运行每一个测试方法前会根据 isDisabledInThisEnvironment()方法判断是简单放弃目标方法的运行,还是按正常方式执行之。该方法默认情况下对所有的测试方 法都返回false,也即执行所有的测试方法。

AbstractSpringContextTests 扩展于ConditionalTestCase,它维护了一个static类型的缓存器(HashMap),它使用键保存Spring ApplicationContext实例,这意味着Spring ApplicationContext是JVM级的,不同测试用例、不同测试方法都可以共享这个实例。

AbstractSingleSpringContextTests继承于AbstractSpringContextTests,它通过一些方法让你方便地指定Spring配置文件所在位置:String[] getConfigLocations():该方法允许你在指定Spring配置文件时使用资源类型前缀,这些资源类型前缀包括:classpath:、 file:。以类似于“com/baobaotao/beans.xml”形式指定的资源被当成类路径资源处理;String[] getConfigPaths():以“/”开头的地址被当成类路径处理,如“/com/baobaotao/beans.xml”,而未以“/”开头的 地址被当成相对于测试类所在包的文件路径,如“beans.xml”表示配置文件在测试类所在类包的目录下;String getConfigPath():和getConfigPaths()类似,在仅需指定一个配置文件中使用。以上三个方法,它们的优先级和我们介绍的先后顺序对应,也就是说,当你在子类中覆盖了getConfigLocations()方法后,其它两个方法就没有意义了。所以你仅需选择三者当中适合的方法进行覆盖,而没有必要同时覆盖多个方法。AbstractSingleSpringContextTests 将根据这些方法指定的Spring配置文件初始化Spring容器,然后将Spring容器引用添加到static缓存中。并通过 getApplicationContext()向子类开放ApplicationContext的引用。 一 般情况下,所有的测试类和测试方法都可以共享这个Spring容器直到测试完结,不过在某些极端情况下,测试方法可能会对Spring容器进行改动(比如 通过程序改变Bean的配置定义),如果这种改变对于其它测试方法来说是有干扰的,这就相当于“弄脏”了作为测试现场的Spring容器,因此在下一个测 试方法执行前必须“抹除”这个改变。你可以简单地在会“弄脏”Spring容器的测试方法中添加setDirty()方法向 AbstractSingleSpringContextTests报告这一行为,这样在下一个测试方法执行 前,AbstractSingleSpringContextTests就会重新加载Spring容器以修补被“弄脏”的部分。

AbstractDependencyInjectionSpringContextTests 所新添的主要功能是其子类的属性能被Spring容器中的Bean自动装配,你无需手工通过ApplicationContext#getBean()从 容器中获取目标Bean自行装配。

AbstractTransactionalSpringContextTests可以完成自动回滚持久化数据的功能,因此可以保证每次运行试方法都可以正常运行。并且可以通过提供的针对事务的各种方法,完成事务前后的各种操作。

AbstractTransactionalDataSourceSpringContextTests 继承于AbstractTransactionalSpringContextTests,它添加了一个JdbcTemplate,你可以借由此道快意直 达数据库。它自动使用Spring容器中的数据源(DataSource)创建好一个JdbcTemplate实例并开放给子类使用。值得注意的是,如果 你采用byName自动装配机制,数据源Bean的名称必须取名为“dataSource”。

另外,如果spring的数据源存在多个时,需要在测试的抽象类的构造方法中指定:

setAutowireMode(AUTOWIRE_BY_NAME); // 更改自动装配机制类型为byName,否则会抛出DataSource重复的异常

这样,可以通过JUnit方便地进行spring中service的测试工作。

注意:Srping2.0中上述测试类在“spring-mock.jar”包中,在spring2.5中上述测试类则在“spring-test.jar”包中。

  评论这张
 
阅读(185)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017