Spring TestContext 做带事务回滚的JUnit测试
2016-10-26 16:13
447 查看
转自 http://tieba.baidu.com/p/2355323012
1. 首先导入相关jar包和library
jar包在Spring的lib下 Spring-test这个jar
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/ed6f152072b462cc1c8a5d750c314229.jpg)
然后导入JUnit4的library这个不用我教了吧。。。
2.然后再工程中新建一个src folder起名为test
在test文件夹下建立一个包暂定为com.test创建一个类普通的类即可
我起名为SchoolTest
这个SchoolTest类要继承AbstractTransactionalJUnit4SpringTestContextTests哥纯粹是背下来的毕竟以前当过翻译英文还凑合不过背不下来也没关系其实很好理解
Transactional代表事务的其他几个单词其实不用解释你也知道多默写几遍就自然熟练了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/2dabc7a9f8fac19d7cc5eefdc7df1149.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/d2272b226adc0b4a57f5e6fc8fa4b5f3.jpg)
3.接下来在这个类上面加一个注解@RunWith(SpringJUnit4ClassRunner.class)
RunWith是junit4的注解意思是此类由这个注解的参数的类来主导单元测试参数类型是Class
SpringJUnit4ClassRunner.class是SpringTest中的一个类作用类似驱动意思是由Spring
Test来主导本次单元测试
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/3c9675fca9d6895744e0f6d992bd19e8.jpg)
4.然后在这个类上写第二个注解
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
ContextConfiguration的作用是定位你的上下文配置文件作用就是减少硬编码 getBean之类的
一旦开始测试 Spring测试框架就去指定位置读取配置文件完成依赖注入
参数是locations注意有了s代表复数参数的取值是字符串数组所以参数要加{}但如果参数只有一个可以省略{}但注意只有在注解的参数类型是数组且只有一个参数时可以省略{}
别给我在普通java类里来个String[] a="sb";这样的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/0992923ffa6bd2edea5315e431b22789.jpg)
还有如果applicationContext.xml位于根目录下就一定要写classpath:否则会出错
至于放在默认的WEB-INF下得情况我没试过是不是可以不写locations我也不想去试没必要
5.然后再写第三个注解
@TestExecutionListeners(listeners={
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
TestExecutionListener 顾名思义测试执行监听器配置的是一系列监听器至于监听器的作用本文暂时不提自行百度
参数是listeners同上参数类型是Class数组里面是各式各样的监听器
d5c5
我选了两个
一个是DependencyInjectionTestExecutionListener监听测试类中的依赖注入是否正确不正确的话有什么结果我也不知道因为我每次都写对的。。。
另一个是TransactionalTestExecutionListener监听测试类中的事务如果测试类中涉及事务就必须配这个监听器
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/c1884ec414fcd9b449c89fcd9b41a924.jpg)
6.接下来写第四个注解
@TransactionConfiguration(transactionManager="txManager",defaultRollback=true)
TransactionConfiguration 顾名思义是配置事务情况的注解
第一个参数transactionManager是你在applicationContext.xml或bean.xml中定义的事务管理器的bean的id
defaultRollback是个很关键的参数是表示测试完成后事务是否会滚参数是布尔型的默认就是true但强烈建议写上true
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/4bc21d2a756aeecbcaf0928fb50791b3.jpg)
这是我的Spring配置文件大部分配置都是我手写的少部分是抄spring官方文档的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/90c093967568620207e9a5ed36601860.jpg)
因为你得把事务管理器给spring spring才能替你托管。。。
至此测试类上的注解全部写完
下面就是简单的内容了
7.下面在类中定义一个业务层的对象或者叫属性成员变量随你
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/4ec1f0f743a8036eec75b2a8561dd7db.jpg)
这个schoolBiz上面写着@Resource 代表从配置文件读取一个叫做schoolBiz的bean如果不用Spring托管单元测试这个写是无法完成注入的因为没有一个容器初始化配置文件中的bean在tomcat启动时
tomcat会读取这个配置文件并初始化但单元测试是与web容器相互独立的所以但用junit需要硬编码但有了spring
test 就避免了硬编码
下面写一个要测试的方法加上两个注解
一个是@Test 这个不多说了
Junit自带的注解表示要测试的方法
另一个是@Transactional 表示这个方法是事务的起始点
注意的是在业务层最好还是别用注解托管事务因为每个方法都要这么写比较麻烦,用xml+spring表达式可以给所有方法托管事务
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/f8c648897cf598b8a2d166d8a1327a92.jpg)
最后就是写方法里的逻辑了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/8a8be725b78aed16a7f946a608906822.jpg)
现在开始测试
测试成功!打开数据库什么也没有因为spring替你回滚了事务保护了数据库现场!
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/99840418eef6dfc7b133ff2f137b27d8.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/95394ebe082910f864267c092ab6fb1c.jpg)
1. 首先导入相关jar包和library
jar包在Spring的lib下 Spring-test这个jar
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/ed6f152072b462cc1c8a5d750c314229.jpg)
然后导入JUnit4的library这个不用我教了吧。。。
2.然后再工程中新建一个src folder起名为test
在test文件夹下建立一个包暂定为com.test创建一个类普通的类即可
我起名为SchoolTest
这个SchoolTest类要继承AbstractTransactionalJUnit4SpringTestContextTests哥纯粹是背下来的毕竟以前当过翻译英文还凑合不过背不下来也没关系其实很好理解
Transactional代表事务的其他几个单词其实不用解释你也知道多默写几遍就自然熟练了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/2dabc7a9f8fac19d7cc5eefdc7df1149.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/d2272b226adc0b4a57f5e6fc8fa4b5f3.jpg)
3.接下来在这个类上面加一个注解@RunWith(SpringJUnit4ClassRunner.class)
RunWith是junit4的注解意思是此类由这个注解的参数的类来主导单元测试参数类型是Class
SpringJUnit4ClassRunner.class是SpringTest中的一个类作用类似驱动意思是由Spring
Test来主导本次单元测试
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/3c9675fca9d6895744e0f6d992bd19e8.jpg)
4.然后在这个类上写第二个注解
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
ContextConfiguration的作用是定位你的上下文配置文件作用就是减少硬编码 getBean之类的
一旦开始测试 Spring测试框架就去指定位置读取配置文件完成依赖注入
参数是locations注意有了s代表复数参数的取值是字符串数组所以参数要加{}但如果参数只有一个可以省略{}但注意只有在注解的参数类型是数组且只有一个参数时可以省略{}
别给我在普通java类里来个String[] a="sb";这样的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/0992923ffa6bd2edea5315e431b22789.jpg)
还有如果applicationContext.xml位于根目录下就一定要写classpath:否则会出错
至于放在默认的WEB-INF下得情况我没试过是不是可以不写locations我也不想去试没必要
5.然后再写第三个注解
@TestExecutionListeners(listeners={
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class
})
TestExecutionListener 顾名思义测试执行监听器配置的是一系列监听器至于监听器的作用本文暂时不提自行百度
参数是listeners同上参数类型是Class数组里面是各式各样的监听器
d5c5
我选了两个
一个是DependencyInjectionTestExecutionListener监听测试类中的依赖注入是否正确不正确的话有什么结果我也不知道因为我每次都写对的。。。
另一个是TransactionalTestExecutionListener监听测试类中的事务如果测试类中涉及事务就必须配这个监听器
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/c1884ec414fcd9b449c89fcd9b41a924.jpg)
6.接下来写第四个注解
@TransactionConfiguration(transactionManager="txManager",defaultRollback=true)
TransactionConfiguration 顾名思义是配置事务情况的注解
第一个参数transactionManager是你在applicationContext.xml或bean.xml中定义的事务管理器的bean的id
defaultRollback是个很关键的参数是表示测试完成后事务是否会滚参数是布尔型的默认就是true但强烈建议写上true
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/4bc21d2a756aeecbcaf0928fb50791b3.jpg)
这是我的Spring配置文件大部分配置都是我手写的少部分是抄spring官方文档的
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/90c093967568620207e9a5ed36601860.jpg)
因为你得把事务管理器给spring spring才能替你托管。。。
至此测试类上的注解全部写完
下面就是简单的内容了
7.下面在类中定义一个业务层的对象或者叫属性成员变量随你
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/4ec1f0f743a8036eec75b2a8561dd7db.jpg)
这个schoolBiz上面写着@Resource 代表从配置文件读取一个叫做schoolBiz的bean如果不用Spring托管单元测试这个写是无法完成注入的因为没有一个容器初始化配置文件中的bean在tomcat启动时
tomcat会读取这个配置文件并初始化但单元测试是与web容器相互独立的所以但用junit需要硬编码但有了spring
test 就避免了硬编码
下面写一个要测试的方法加上两个注解
一个是@Test 这个不多说了
Junit自带的注解表示要测试的方法
另一个是@Transactional 表示这个方法是事务的起始点
注意的是在业务层最好还是别用注解托管事务因为每个方法都要这么写比较麻烦,用xml+spring表达式可以给所有方法托管事务
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/f8c648897cf598b8a2d166d8a1327a92.jpg)
最后就是写方法里的逻辑了
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/8a8be725b78aed16a7f946a608906822.jpg)
现在开始测试
测试成功!打开数据库什么也没有因为spring替你回滚了事务保护了数据库现场!
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/99840418eef6dfc7b133ff2f137b27d8.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/28/95394ebe082910f864267c092ab6fb1c.jpg)
相关文章推荐
- 用Spring TestContext 做带事务回滚的JUnit测试
- spring test junit 事务回滚
- 使用junit 测试 spring 的testContext框架
- Spring+Junit,测试事务时,一直回滚
- spring结合junit进行单元测试(二)——测试后进行事务回滚
- Spring Test, JUnit, Mockito, Hamcrest 集成 Web 测试
- spring AOP 配置事务不起作用的问题(用Junit测试service)
- spring TestUtil Junit测试类
- Spring TestContext测试框架
- Spring TestContext 测试框架
- Junit测试的羽翼Spring-test
- Spring整合Junit测试,并且配置事务
- spring测试junit事务管理及spring面向接口注入和实现类单独注入(无实现接口),实现类实现接口而实现类单独注入否则会报错。
- 使用Spring TestContext 测试框架,完美测试基于Spring的应用程序
- 使用 Spring TestContext 测试框架
- Junit加载Spring容器作单元测试_添加事务回滚
- 使用Spring TestContext 测试框架,完美测试基于Spring的应用程序
- JUnit Test in Spring Context with JNDI Data Source
- junit 测试spring-test 代码!在项目中运行测试通过,留着以后直接使用
- JUnit Test in Spring Context with JNDI Data Source