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>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 答1: Spring框架提供了非常便捷的整合MyBatis和JUnit并进行事务管理的方式。下面是一个简单的示例: 首先,我们需要在Spring配置文件中声明MyBatis的SqlSessionFactory和MapperScannerConfigurer: ``` <!-- 数据源配置 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- MyBatis SqlSessionFactory 配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:com/example/mapper/*.xml"/> </bean> <!-- MapperScannerConfigurer 配置 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean> ``` 其中,dataSource是数据源配置,sqlSessionFactory是MyBatis的SqlSessionFactory配置,mapperLocations指定了MyBatis的Mapper映射文件所在的路径,MapperScannerConfigurer则是MyBatis的Mapper接口扫描配置。 接下来,我们需要在Spring配置文件中配置事务管理器和事务通知: ``` <!-- 事务管理器配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 事务通知配置 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.service.*.*(..))"/> </aop:config> ``` 其中,transactionManager是事务管理器的配置,txAdvice是事务通知的配置,用于定义事务的传播行为和隔离级别,aop:advisor则是将事务通知织入Service层的切点中。 最后,我们需要在JUnit测试类中注入Mapper接口和Service实例,并在测试方法中进行事务操作: ``` @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-config.xml"}) @Transactional public class UserServiceTest { @Autowired private UserMapper userMapper; @Autowired private UserService userService; @Test public void testAddUser() throws Exception { User user = new User(); user.setName("test"); user.setAge(18); userService.addUser(user); User result = userMapper.getUserById(user.getId()); assertNotNull(result); assertEquals(user.getName(), result.getName()); assertEquals(user.getAge(), result.getAge()); } } ``` 其中,@RunWith(SpringJUnit4ClassRunner.class)和@ContextConfiguration(locations = {"classpath:spring-config.xml"})用于加载Spring配置文件,@Transactional用于声明事务,@Autowired用于注入Mapper接口和Service实例,testAddUser方法中则是进行事务操作并进行断言。 通过以上配置和示例,我们就可以完整地实现Spring整合MyBatis和JUnit并进行事务管理了。 ### 答2: Spring整合MyBatis和JUnit事务管理是一种常见的开发方式,可以使开发人员更方便地进行单元测试和事务管理。 首先,Spring整合MyBatis可以通过配置来实现。在Spring的配置文件中,我们可以定义MyBatis的数据源和SqlSessionFactory,并将其注入到Spring容器中。同时,我们还可以通过配置MapperScannerConfigurer来扫描MyBatis的mapper接口,并自动将其注册到Spring容器中。这样,我们就可以在Spring中使用MyBatis的mapper接口来进行持久化操作。 接下来,使用JUnit进行单元测试。在Spring中,我们可以使用Spring Test模块提供的JUnit运行器来执行我们的单元测试。通过配置@ContextConfiguration注解,我们可以指定需要加载的Spring配置文件,并使用@Autowired注解来自动注入我们需要测试的对象。此外,我们还可以使用@TransactionConfiguration注解来配置事务管理器的一些属性,以保证在测试期间的事务控制。 最后,事务管理是一个非常重要的功能。在Spring中,我们可以通过配置@EnableTransactionManagement注解来启用事务管理功能。通过在方法上添加@Transactional注解,我们可以指定哪些方法需要进行事务管理。在事务控制的过程中,Spring会根据配置来进行事务的提交或操作,以保证数据的一致性和完整性。 总而言之,Spring整合MyBatis和JUnit事务管理是一种灵活而方便的开发方式,可以帮助开发人员更好地进行单元测试和事务管理。通过合理配置,我们可以充分发挥Spring框架的功能,提高开发效率和代码质量。 ### 答3: Spring整合MyBatis和JUnit事务管理是常见的企业级Java应用开发方案之一。下面我将用300字答这个问题。 首先,Spring整合MyBatis和JUnit可以方便地进行持久化数据层和业务逻辑层的单元测试。通过使用Spring的测试框架和JUnit,开发人员可以轻松地编写和运行单元测试,以有效地验证代码的正确性和稳定性。通过整合MyBatis,可以使用MyBatis的Mapper接口来访问数据库,并结合Spring的依赖注入功能,将MyBatis的Mapper接口注入到测试类中,方便进行数据库操作的模拟或真实测试。 其次,Spring整合MyBatis还可以简化事务管理Spring提供了一个统一的事务管理器,可以方便地管理数据库操作的事务,确保数据的完整性和一致性。通过在Spring配置文件中配置事务管理器和事务属性,可以将事务的控制从业务逻辑中解耦出来,使得代码更加清晰和可维护。在JUnit测试中,也可以使用Spring事务管理功能,方便地数据库操作,保持测试环境的干净和一致性。 最后,Spring整合MyBatis和JUnit还可以提高代码的可测试性和可扩展性。通过使用依赖注入和面向接口编程的思想,可以实现代码的解耦和模块化,使得代码更容易被维护和扩展。同时,使用JUnit进行单元测试可以及早地发现和修复代码中的问题,提高代码的质量和稳定性。 综上所述,Spring整合MyBatis和JUnit事务管理是一种强大且灵活的应用开发方案,可以帮助开发人员更加高效和方便地进行单元测试和事务管理,提高代码的质量和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值