使用spring机制进行单元测试

来源:互联网 发布:网络语029什么意思 编辑:程序博客网 时间:2024/06/05 18:01
在接触Spring的测试机制之前,一直是直接使用JUnit进行集成测试。在spring框架中,直接使用JUnit进行测试时,存在以下几点问题:
1. 在获取需要测试的Bean时,需要直接使用ApplicationContext的getBean()方法从Spirng容器中获取需要测试的目标Bean;
2. 甚至在获取Spring的配置文件时,通过配置文件的绝对路径来寻找applicationContext.xml文件。

3. 直接使用JUnit进行测试容易破坏数据库的现有结构,例如主键ID自增长的情况以及由于主键重复造成的同样的数据插入第二次时的异常等。


Spring提供了一套基于JUnit扩展的测试机制,可以方便地实现Bean的获取、配置文件的获取、保护数据库现场、同一事务下访问数据库以检验业务操作的正确性等特性。

使用Spring的测试机制:
Spring的测试包为spring-test.jar文件(某些版本的测试包可能在spring-mock.jar下)。Spring的测试机制是基于JUnit的扩展,在org.springframework.test包下,可以看到6个从TestCase基础上扩展出来的抽象类,分别是:

  1. ConditionalTestCase(可以有选择地关闭掉一些测试方法,不让他们在测试用例中执行,而无需将这些方法注释掉)
  2. AbstractSpringContextTests(运行多个测试用例和测试方法时,Spring上下文只需创建一次)
  3. AbstractSingleSpringContextTests(方便手工指定Spring配置文件、手工设定Spring容器是否需要重新加载)
  4. AbstractDependencyInjectionSpringContextTests(自动装配、依赖检查、自动注入)
  5. AbstractTransactionalSpringContextTests(自动恢复数据库现场即自动回滚)
  6. AbstractTransactionalDataSourceSpringContextTests(通过JDBC访问数据库,检测数据操作正确性)

上述抽象类按照先后顺序逐步加强了每个抽象类的功能,并且按照逐步继承的关系,使得子抽象类具有父抽象类的所有特性,因此最终AbstractTransactionalDataSourceSpringContextTests抽象类具有其所有祖先抽象类的特性以及其自身的特性,实际应用中可以根据需要选择需要使用的抽象基类进行扩展。
AbstractDependencyInjectionSpringContextTests的使用场景:测试初期,需要大量数据,使用该类进行测试,可以save数据到数据库中。
AbstractTransactionalSpringContextTests的使用场景:在系统开发的中后期,需要进行的测试,以各种负责的业务操作为主了,此时可能需要一些可以保护数据库现场的测试功能, 该类提供了一套数据库自动回滚的功能,执行了业务逻辑,但是对数据库没有影响。从而不必每次测试完成后都重新恢复数据库的操作。
0 0
原创粉丝点击