spring事务管理 junit回滚

在写单元测试的时候,一般是对数据库进行增删改查的操作,这个时候,如果之前删除了某条记录,自然后面的程序就找不到这条记录了,所以可以通过配置spring的事务管理或者测试框架来回滚,减少工作量。使用的数据库是postgreSQL和mysql。

在写这篇文章的时候,很多地方借鉴了下面两篇文章:

http://www.cnblogs.com/rainisic/archive/2012/01/22/Spring_Test_Framework.html

http://blog.163.com/wf_shunqiziran/blog/static/17630720920121084325322/

1、创建测试类

  创建一个测试用的类,推荐名称为 “被测试类名称 + Test”。

  测试类应该继承与 AbstractJUnit4SpringContextTests 或 AbstractTransactionalJUnit4SpringContextTests

  对于 AbstractJUnit4springcontextTests 和 AbstractTransactionalJUnit4SpringContextTests 类的选择:

  如果再你的测试类中,需要用到事务管理(比如要在测试结果出来之后回滚测试内容),就可以使用AbstractTransactionalJUnit4SpringTests类。事务管理的使用方法和正常使用Spring事务管理是一样的。再此需要注意的是,如果想要使用声明式事务管理,即使用AbstractTransactionalJUnitSpringContextTests类,请在applicationContext.xml文件中加入transactionManager bean:

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

  如果没有添加上述bean,将会抛出NoSuchBeanDefinitionException,指明 No bean named 'transactionManager' is definded.

2. 配置测试类

  添加如下内容在class前,用于配置applicationContext.xml文件的位置。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")

3. 创建测试方法

  创建测试用方法,推荐名称为 “被测方法名称+ Test”。

  测试方法上方加入 @Test

4、 通过JUnit 4 执行

  右键方法名,选择则“Run As”→“JUnit Test”即可

 

我以前也是通过这种方法来配置单元测试的自动回滚的,不过在新的项目里发现不行,于是又是各种度娘谷哥,终于找到了。顺便说下我搜索到的不能自动回滚的集中原因:

1、代码中含有try-catch块导致不能回滚。(个人觉得不靠谱)

2、方法里面有非public方法。

3、加载了2次配置文件,导致insert和rollback方法不在一个事物里面。我遇到的就是这种情况。

如:我在注解当中已经加载了一次applicationContext.xml文件,而在setUp()里面又加载了一次,导致方法被当成2个事物提交了。于是我使用注解来加载bean。

[java]  view plain copy
  1. @Autowired  
  2.     private AppointmentDao appointmentDao;  

单元测试用例上面的注解是:

[java]  view plain copy
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)  
  3. @Transactional  
  4. /**读取配置文件到运行环境。注意:file的路径 */  
  5. @ContextConfiguration(locations={"classpath:applicationContext.xml"})  

 在applicationContext.xml文件当中:

[java]  view plain copy
  1. <bean id="txManager"  
  2.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.     </bean>  
### 实现事务回滚的方法 为了确保数据库操作不会影响实际的数据,在JUnit测试中通常会使用事务管理来自动回滚任何更改。这可以通过配置Spring框架的支持功能完成。 在Spring环境中,可以借助`@Transactional`注解使整个测试方法运行在一个事务上下文中,并且默认情况下会在测试结束时自动回滚事务[^1]。 下面是一个简单的例子展示如何设置: ```java import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.transaction.TransactionalTestExecutionListener; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests; import org.springframework.transaction.annotation.Transactional; @ContextConfiguration(locations = {"classpath:spring-config.xml"}) @Transactional public class MyServiceTest extends AbstractTransactionalTestNGSpringContextTests { @Autowired private MyService myService; @Test public void testAddUser() { User user = new User(); user.setName("test"); myService.addUser(user); // 断言或其他验证逻辑... } } ``` 在这个案例中,当`testAddUser()`执行完毕之后,无论是否有异常抛出,都会触发事务回滚操作,从而保证了测试环境的一致性和隔离性。 对于更复杂的场景,比如需要处理特定条件下才发生回滚的情况,则可能需要用到自定义的事务管理策略或者手动控制事务边界[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值