博客网 >

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”包中。

<< 重大发现! / Spring配置中transac... >>

专题推荐

不平凡的水果世界

不平凡的水果世界

平凡的水果世界,平凡中的不平凡。 今朝看水果是水果 ,看水果还是水果 ,看水果已不是水果。这境界,谁人可比?在不平凡的水果世界里,仁者见仁,智者见智。

中国春节的那些习俗

中国春节的那些习俗

正月是农历新年的开始,人们往往将它看作是新的一年年运好坏的兆示期。所以,过年的时候“禁忌”特别多。当然,各个地方的风俗习惯不一样,过年的禁忌也是不一样的。

评论
0/200
表情 验证码:

cyq1984

  • 文章总数0
  • 画报总数0
  • 画报点击数0
  • 文章点击数0
个人排行
        博文分类
        日期归档