转载自 http://blog.csdn.net/funi16/article/details/8691575html
在写单元测试的时候,通常是对数据库进行增删改查的操做,这个时候,若是以前删除了某条记录,天然后面的程序就找不到这条记录了,因此能够经过配置spring的事务管理或者测试框架来回滚,减小工做量。使用的数据库是postgreSQL和mysql。java
在写这篇文章的时候,不少地方借鉴了下面两篇文章:mysql
http://www.cnblogs.com/rainisic/archive/2012/01/22/Spring_Test_Framework.htmlspring
http://blog.163.com/wf_shunqiziran/blog/static/17630720920121084325322/sql
建立一个测试用的类,推荐名称为 “被测试类名称 + Test”。数据库
测试类应该继承与 AbstractJUnit4SpringContextTests 或 AbstractTransactionalJUnit4SpringContextTestsapp
对于 AbstractJUnit4springcontextTests 和 AbstractTransactionalJUnit4SpringContextTests 类的选择:框架
若是再你的测试类中,须要用到事务管理(好比要在测试结果出来以后回滚测试内容),就可使用AbstractTransactionalJUnit4SpringTests类。事务管理的使用方法和正常使用Spring事务管理是同样的。再此须要注意的是,若是想要使用声明式事务管理,即便用AbstractTransactionalJUnitSpringContextTests类,请在applicationContext.xml文件中加入transactionManager bean:post
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
若是没有添加上述bean,将会抛出NoSuchBeanDefinitionException,指明 No bean named 'transactionManager' is definded.单元测试
添加以下内容在class前,用于配置applicationContext.xml文件的位置。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
建立测试用方法,推荐名称为 “被测方法名称+ Test”。
测试方法上方加入 @Test
右键方法名,选择则“Run As”→“JUnit Test”便可
我之前也是经过这种方法来配置单元测试的自动回滚的,不过在新的项目里发现不行,因而又是各类度娘谷哥,终于找到了。顺便说下我搜索到的不能自动回滚的集中缘由:
一、代码中含有try-catch块致使不能回滚。(我的以为不靠谱)
二、方法里面有非public方法。
三、加载了2次配置文件,致使insert和rollback方法不在一个事物里面。我遇到的就是这种状况。
如:我在注解当中已经加载了一次applicationContext.xml文件,而在setUp()里面又加载了一次,致使方法被当成2个事物提交了。因而我使用注解来加载bean。
单元测试用例上面的注解是:
在applicationContext.xml文件当中: