现在的位置: 首页 > 综合 > 正文

junit4 测试 spring3

2018年05月21日 ⁄ 综合 ⁄ 共 6598字 ⁄ 字号 评论关闭

Spring3.04和Junit4         

  

     

  1. @RunWith(SpringJUnit4ClassRunner.class//指定测试用例的运行器 这里是指定了Junit4  
  2. @ContextConfiguration({"/applicationContext-hibernate.xml","/applicationContext-beans.xml"}) //指定Spring的配置文件 /为classpath下  
  3. //@Transactional //对所有的测试方法都使用事务,并在测试完成后回滚事务  
  4. public class UserServiceImplTest {  
  5. //  @Autowired  
  6. //  private ApplicationContext appplicationContext; //自动注入applicationContext,这样就可以使用appli*.getBean("beanName")  
  7.     @Resource       //会自动注入 default by type  
  8.     private UserDao userDao;  
  9.     @Resource  
  10.     private UserService userService;  
  11.       
  12.     @Before //在每个测试用例方法之前都会执行  
  13.     public void init(){  
  14.     }  
  15.       
  16.     @After //在每个测试用例执行完之后执行  
  17.     public void destory(){  
  18.     }  
  19.       
  20.     @Test  
  21.     @Transactional  //使用该注释会使用事务,而且在测试完成之后会回滚事务,也就是说在该方法中做出的一切操作都不会对数据库中的数据产生任何影响  
  22. //  @Rollback(false) //这里设置为false,就让事务不回滚  
  23.     public void testAdd(){  
  24.         Assert.assertNotNull(userDao);  
  25.         Assert.assertNotNull(userService);  
  26.         userDao.add(new User("userDao1","world!"));  
  27.         userService.registerUser(new User("UserService1","world!"));  
  28.     }  
  29.       
  30.     public void testTest() {  
  31.           
  32.     }  
  33. }  

 

 

 

 

 

 

 

 

 

  1. 在Spring3.x以上必须采用Junit4.8以上,否则可能出现问题。 在Spring相关的测试中如果使用事务采用AbstractJUnit4SpringContextTests  
Java代码
复制代码
 收藏代码
  1. 如果不采用事务管理采用AbstractJUnit4SpringContextTests,注意在spring中测试时候必须注意junit4中事务  
Java代码
复制代码
 收藏代码
  1. 默认测试中为回滚的了。  
Java代码
复制代码
 收藏代码
  1. package com.easyway.web.services.component.job;  
  2.   
  3. import org.junit.Test;  
  4. import org.junit.runner.RunWith;  
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.test.context.ContextConfiguration;  
  7. import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;  
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  9. import org.springframework.util.Assert;  
  10.   
  11. @RunWith(SpringJUnit4ClassRunner.class)  
  12. @ContextConfiguration(locations = {"classpath:services/service-*.xml","classpath:services/ext/service-*.xml",  
  13.         "classpath:services/ext/YichengYunwei/service-*.xml"})  
  14. public class InspectionJobTest extends AbstractJUnit4SpringContextTests{  
  15.   
  16.   
  17.   
  18.     @Autowired  
  19.     InspectionJob myJob;  
  20.       
  21.     @Test  
  22.     public void testDoJob() {  
  23.       
  24.       
  25.     }  
  26.   
  27. }  

 

spring3多个事务管理器的使用

被忽略的Spring3小改进——支持多数据源的@Transactional事务注解

在用@Transactional配置事务时,确实没注意过多数据源问题,但是记得之前常用的XML配置方式中,对多数据源支持很简单,我想注解配置起来应该也不会太麻烦。

 

先回顾一下之前个人习惯使用的 <tx:advice> + <aop:config>配置方式,大致步骤如下:
1)定义与事务管理器对应的事务通知
2)配置需要拦截的方法调用切面
3)将切入点连接到相应的事务通知
整个系统的事务,三下配置,一处搞定,相比注解方式,个人觉得更简单、省力、统一;而要支持多数据源,再做一遍这123即可,非常简单。

 

不过同事在网上百度了一圈,说大部分的结论是Spring的@Transactional注解不支持,听到这一点我很诧异,不应该啊,要不查查Spring的官方文档?

一查马上发现,在Spring3.0的参考文档中,针对这个问题的,真新增了一节(10.5.6.2)来解决,参见:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations 

Most Spring applications only need a single transaction manager, but there may be situations where you want multiple independent transaction managers in a single application. The value attribute of the
@Transactional annotation can be used to optionally specify the identity of the
PlatformTransactionManager to be used. This can either be the bean name or the qualifier value
of the transaction manager bean

 

也就是说,在Spring2.5之前,@Transactional注解确实不支持多数据源,但是Spring3为其增加了value属性配置,可以指定当前事务通知对应的事务管理器。

 

检查了一下Spring的changelogs,这个特性是在3.0M4版中加入的:
@Transactional supports qualifier value for choosing between multiple transaction managers

[解难]

看来,或许这是一个有用的小改进,但很可能被大家忽略了。下面是从官方文档中摘抄出来的示例配置方式,供需要的同学参考:

1、配置事务注解驱动、每个数据源对应的事务管理器,并定义“限定符”

Xml代码  
  1. <tx:annotation-driven/>  
  2.   
  3. <bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">  
  4. ...  
  5. <qualifier value="order"/>  
  6. </bean>  
  7. <bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">  
  8. ...  
  9. <qualifier value="account"/>  
  10. </bean>   
Xml代码  收藏代码
  1. <tx:annotation-driven/>  
  2.   
  3. <bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">  
  4. ...  
  5. <qualifier value="order"/>  
  6. </bean>  
  7. <bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">  
  8. ...  
  9. <qualifier value="account"/>  
  10. </bean>   

 

2、在需要事务的地方,指定“限定符”

 

 

Java代码  收藏代码
  1. public class TransactionalService {  
  2.   
  3. @Transactional("order")  
  4. public void setSomething(String name) { ... }  
  5.   
  6. @Transactional("account")  
  7. public void doSomething() { ... }  
  8. }  
Java代码  收藏代码
  1. public class TransactionalService {  
  2.   
  3. @Transactional("order")  
  4. public void setSomething(String name) { ... }  
  5.   
  6. @Transactional("account")  
  7. public void doSomething() { ... }  
  8. }  

 

3、如果不指定“限定符”,将默认使用“transationManager”命名对应的事务管理器

Java代码  收藏代码
  1. The default <tx:annotation-driven> target bean name transactionManager will still be used if no specifically qualified PlatformTransactionManager bean is found  
Java代码  收藏代码
  1. The default <tx:annotation-driven> target bean name transactionManager will still be used if no specifically qualified PlatformTransactionManager bean is found  

抱歉!评论已关闭.