概述
集成测试是在单元测试之上,通常是将一个或多个已进行过单元测试的组件组合起来完成的,即集成测试中一般不会出现Mock对象,都是实实在在的真实实现。
对于单元测试,如前边在进行数据访问层单元测试时,通过Mock HibernateTemplate对象然后将其注入到相应的DAO实现,此时单元测试只测试某层的某个功能是否正确,对其他层如何提供服务采用Mock方式提供。
对于集成测试,如要进行数据访问层集成测试时,需要实实在在的HibernateTemplate对象然后将其注入到相应的DAO实现,此时集成测试将不仅测试该层功能是否正确,还将测试服务提供者提供的服务是否正确执行。
使用Spring的一个好处是能非常简单的进行集成测试,无需依赖web服务器或应用服务器即可完成测试。Spring通过提供一套TestContext框架来简化集成测试,使用TestContext测试框架能获得许多好处,如Spring IoC容器缓存、事务管理、依赖注入、Spring测试支持类等等。
Spring TestContext框架支持
Spring TestContext框架提供了一些通用的集成测试支持,主要提供如下支持:
一、上下文管理及缓存:
对于每一个测试用例(测试类)应该只有一个上下文,而不是每个测试方法都创建新的上下文,这样有助于减少启动容器的开销,提供测试效率。可通过如下方式指定要加载的上下文:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
locations={"classpath:applicationContext-resources-test.xml",
"classpath:cn/javass/point/dao/applicationContext-hibernate.xml"})
public class GoodsHibernateDaoIntegrationTest {
}
-
locations:指定Spring配置文件位置;
-
inheritLocations:如果设置为false,将屏蔽掉父类中使用该注解指定的配置文件位置,默认为true表示继承父类中使用该注解指定的配置文件位置。
二、Test Fixture(测试固件)的依赖注入:
Test Fixture可以指运行测试时需要的任何东西,一般通过@Before定义的初始化Fixture方法准备这些资源,而通过@After定义的销毁Fixture方法销毁或还原这些资源。
Test Fixture的依赖注入就是使用Spring IoC容器的注入功能准备和销毁这些资源。可通过如下方式注入Test Fixture:
@Autowired
private IGoodsDao goodsDao;
@Autowired
private ApplicationContext ctx;
即可以通过Spring提供的注解实现Bean的依赖注入来完成Test Fixture的依赖注入。
三、事务管理:
开启测试类的事务管理支持,即使用Spring 容器的事务管理功能,从而可以独立于应用服务器完成事务相关功能的测试。为了使测试中的事务管理起作用需要通过如下方式开启测试类事务的支持:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
locations={"classpath:applicationContext-resources-test.xml",
"classpath:cn/javass/point/dao/applicationContext-hibernate.xml"})
@TransactionConfiguration(
transactionManager = "txManager", defaultRollback=true)
public class GoodsHibernateDaoIntegrationTest {
}
Spring提供如下事务相关注解来支持事务管理:
-
@Transactional:使用@Transactional注解的类或方法将得到事务支持
-
transactionManager:指定事务管理器;
-
defaultRollback:是否回滚事务,默认为true表示回滚事务。
Spring还通过提供如下注解来简化事务测试:
-
@Transactional:使用@Transactional注解的类或方法表示需要事务支持;
-
@NotTransactional:只能注解方法,使用@NotTransactional注解的方法表示不需要事务支持,即不运行在事务中,Spring 3开始已不推荐使用;
-
@BeforeTransaction和@AfterTransaction:使用这两个注解注解的方法定义了在一个事务性测试方法之前或之后执行的行为,且被注解的方法将运行在该事务性方法的事务之外。
-
@Rollback(true):默认为true,用于替换@TransactionConfiguration中定义的defaultRollback指定的回滚行为。
四、常用注解支持:Spring框架提供如下注解来简化集成测试:
-
@DirtiesContext:表示每个测试方法执行完毕需关闭当前上下文并重建一个全新的上下文,即不缓存上下文。可应用到类或方法级别,但在JUnit 3.8中只能应用到方法级别。
-
@ExpectedException:表示被注解的方法预期将抛出一个异常,使用如@ExpectedException(NotCodeException.class)来指定异常,定义方式类似于Junit 4中的@Test(expected = NotCodeException.class),@ExpectedException注解和@Test(expected =……)应该两者选一。
-
@Repeat :</