码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-04-14 12:21:23      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

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替你回滚了事务 保护了数据库现场!技术分享
看数据库表 什么也没有吧
技术分享







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

标签:

原文地址:http://blog.csdn.net/mingtianhaiyouwo/article/details/51149332

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!