用Spring TestContext 做带事务回滚的JUnit测试

JUnit单元测试框架很常用 但可能会破坏数据库现场 以及大量的硬编码出现(applicationContext.getBean(""));

今天哥们给新手介绍一下 Spring Test这个Spring自带的jar包中的一些注解 实现单元测试+事务回滚+注解依赖注入

网上的相关教程不多
我的意思是有用的不多 基本都是类似api文档那种 给你罗列一大堆注解和类 告诉你他们的作用 你看完了也不知道该从哪里入手

我自己琢磨了几天(哥们天赋不是很高) 写了一个测试类 测试成功 给大家分享一下

首先导入相关jar包和library

jar包在Spring的lib下 Spring-test这个jar

然后导入JUnit4的library 这个不用我教了吧。。。

然后再工程中新建一个src
folder 起名为test

在test文件夹下建立一个包 暂定为com.test 创建一个类 普通的类即可

我起名为SchoolTest

这个SchoolTest类要继承AbstractTransactionalJUnit4SpringTestContextTests 哥纯粹是背下来的 毕竟以前当过翻译 英文还凑合 不过背不下来也没关系 其实很好理解

Transactional代表事务的 其他几个单词其实不用解释你也知道 多默写几遍就自然熟练了

接下来 在这个类上面加一个注解@RunWith(SpringJUnit4ClassRunner.class)

RunWith是junit4的注解 意思是此类由这个注解的参数的类来主导单元测试 参数类型是Class

SpringJUnit4ClassRunner.class是SpringTest中的一个类 作用类似驱动 意思是由Spring Test来主导本次单元测试

然后在这个类上写第二个注解

@ContextConfiguration(locations={"classpath:applicationContext.xml"})

ContextConfiguration的作用是定位你的上下文配置文件 作用就是减少硬编码 getBean之类的

一旦开始测试 Spring 测试框架就去指定位置读取配置文件 完成依赖注入

参数是locations 注意有了s代表复数 参数的取值是字符串数组 所以参数要加{} 但如果参数只有一个 可以省略{} 但注意 只有在注解的参数类型是数组且只有一个参数时 可以省略{}

别给我在普通java类里来个String[] a="sb";这样的

还有如果applicationContext.xml位于根目录下 就一定要写classpath: 否则会出错

至于放在默认的WEB-INF下得情况 我没试过是不是可以不写locations 我也不想去试 没必要

然后再写第三个注解

@TestExecutionListeners(listeners={

DependencyInjectionTestExecutionListener.class,

TransactionalTestExecutionListener.class

})

TestExecutionListener 顾名思义 测试执行监听器 配置的是一系列监听器 至于监听器的作用本文暂时不提 自行百度

参数是listeners 同上 参数类型是Class数组 里面是各式各样的监听器 我选了两个

一个是DependencyInjectionTestExecutionListener 监听测试类中的依赖注入是否正确 不正确的话有什么结果我也不知道 因为我每次都写对的。。。

另一个是TransactionalTestExecutionListener 监听测试类中的事务 如果测试类中涉及事务 就必须配这个监听器

接下来写第四个注解

@TransactionConfiguration(transactionManager="txManager",defaultRollback=true)

TransactionConfiguration 顾名思义 是配置事务情况的注解

第一个参数transactionManager是你在applicationContext.xml或bean.xml中定义的事务管理器的bean的id

defaultRollback是个很关键的参数 是表示测试完成后事务是否会滚 参数是布尔型的 默认就是true 但强烈建议写上true

这是我的Spring配置文件 大部分配置都是我手写的 少部分是抄spring官方文档的

下面在类中定义一个业务层的对象 或者叫属性 成员变量 随你

这个schoolBiz上面写着@Resource 代表从配置文件读取一个叫做schoolBiz的bean
如果不用Spring托管单元测试 这个写是无法完成注入的 因为没有一个容器初始化配置文件中的bean 在tomcat启动时 tomcat会读取这个配置文件并初始化 但单元测试是与web容器相互独立的 所以但用junit需要硬编码 但有了spring test 就避免了硬编码

下面 写一个要测试的方法 加上两个注解

一个是@Test 这个不多说了 Junit自带的注解 表示要测试的方法

另一个是@Transactional 表示这个方法是事务的起始点

注意的是 在业务层最好还是别用注解托管事务 因为每个方法都要这么写比较麻烦 用xml+spring表达式可以给所有方法托管事务

最后就是写方法里的逻辑了

现在开始测试

测试成功! 打开数据库 什么也没有 因为spring替你回滚了事务 保护了数据库现场!

看数据库表 什么也没有吧

时间: 2024-12-23 04:34:22

用Spring TestContext 做带事务回滚的JUnit测试的相关文章

spring事务回滚的一些个人总结

1.  spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(取决于是否抛出runtime异常). 2.  如果抛出runtime exception 并在你的业务方法中没有try-catch到的话,事务会回滚,所以一般不在业务层try-catch. 3. 一般不需要在业务方法中catch异常,一般在调用该service的action中catch,然后将结果导到出错页面,如果非要try-catch,在做完你想做的工作后(比如关闭文件等)

(转)spring异常抛出触发事务回滚策略

背景:在面试时候问到事务方法在调用过程中出现异常,是否会传递的问题,平时接触的比较少,有些懵逼. spring异常抛出触发事务回滚策略 Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 测试用业务逻辑方法: /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exceptio

Spring @Transactional ——事务回滚

工作原理运行配置@Transactional注解的测试类的时候,具体会发生如下步骤1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中.在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]2)事务结束时,回滚在第1步骤中得到的代理conne

spring管理事务回滚

spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代码如下: ? 1 2 3 4 5 6 7 public method() {   Dao1.save(Person1);   Dao1.save(Person2);   Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中   Dao1.save(Person2); } 期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存 正常情

配置Spring JDBC的事务回滚失效

今天配置Mysql DBCP连接池事务回滚失效,竟然浪费了我一下午的时间去调研,问了好多人也都没发现,最后还得靠自己,总结问题如下: 1.Mysql数据库用的是MyISAM表结构而非InnerDB(浪费了两个小时) 2.网上说的默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) . 3.配置DBC

经验总结55--spring开启事务回滚

使用spring的@Transactional注解,异常时,进行事务回滚. 1.引用 xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 2.开启事务 <tx:annotation-driven transaction-manager=&q

springmvc事务回滚失效

转载:http://blog.csdn.net/z69183787/article/details/37819831 前文提到,最新换了框架,新项目用SpringMVC + Spring JdbcTemplate.搭框架时,发现了一个事务无法正常回滚的问题,记录如下: 首先展示问题: Spring applicationContext.xml配置: [html] view plaincopy <bean id="dataSource" class="org.spring

ssh事务回滚,纪念这几个月困扰已久的心酸

以前的事务采用的是JTA,xml注入的方式.本人就着开发要优雅合理利用轮子的态度,一直不满意JTA式的申明和切入方式. spring的注解方式多优雅,可是万恶的直到项目快要上线时终于找到了注解式不能回滚的缘由. Spring的事务回滚,当且仅当捕获到RuntimeException类型异常时,才会回滚,对普通Exception异常无效. 满满一把心酸泪,,, 原理:代码贴上: 配置可参考如下:http://blog.csdn.net/greensurfer/article/details/752

【Java EE 学习第19天】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: (1)使用GZIPOutputStream工具对数据进行压缩,中间借助了ByteArrayOutputStream类进行结果的存储. (2)使用过滤器对浏览器请求进行拦截,通过自定义HttpServletResponse类(使用包装模式),重写getWriter方法,使得写出的目的地转变成ByteA