junit4和spring test测试之AbstractTransactionalJUnit4SpringContextTests详解

使用Spring TestContext Framework对程序进行单元测试有两种方式,一种是测试类继承AbstractJUnit4SpringContextTests或继承AbstractTransactionalJUnit4SpringContextTests,并且使用@ContextConfiguration注解来指定配置文件的位置,如果不置顶配置文件的位置的话,它会默认测试目标类的全限名加上"-context.xml"(eg: com.sch.services.UserService默认的配置文件为:classpath:com/sch/services/UserService-context.xml). 
先来看一下AbstractJUnit4SpringContextTests和AbstractTransactionalJUnit4SpringContextTests的原型,了解两者的区别: 
AbstractJUnit4SpringContextTests: 

Java代码  
@RunWith(SpringJUnit4ClassRunner.class) //指定测试用例运行器  
 @TestExecutionListeners(                 // 注册了两个TestExecutionListener监听器  
  { DependencyInjectionTestExecutionListener.class,  
    DirtiesContextTestExecutionListener.class })  
 public class AbstractJUnit4SpringContextTests implements ApplicationContextAware {  
    …  
  }  

 

AbstractTransactionalJUnit4SpringContextTests: 

Java代码  
// 注册测试用例事务管理的监听器  
  @TestExecutionListeners( { TransactionalTestExecutionListener.class })  
  @Transactional    // 使测试用例的所有方法都将工作于事务环境下  
  public class AbstractTransactionalJUnit4SpringContextTests   
  extends AbstractJUnit4SpringContextTests {  
    …  
  }  


可以看出AbstractTransactionalJUnit4SpringContextTests 是继承于AbstractJUnit4SpringContextTests 并增加了一个TransactionalTestExecutionListener监听器,可见AbstractTransactionalJUnit4SpringContextTests 增加了测试类对事物的控制,可见测试类可以使用注解也可以使用继承抽象类。 

接下来看一下3个监听器的作用: 

DependencyInjectionTestExecutionListener提供了依赖注入的功能,它负责解析测试类中的@Autowried和@Resource注解 

DirtiesContextTestExecutionListener只要的作用是处理测试类中的上下文遭到破坏时,重新注册上下文,即在测试方法上使用@DirtiesContext启用;当测试方法被@DirtiesContext注解修饰时,当测试方法结束的时候,Spring TestContext会刷新Spring的上下文(就是重新创建ApplicationContext)。 

TransactionalTestExecutionListener主要负责解析和事物操作有关的注解,例如:@Transaction、@BeforeTransaction、@AfterTransaction、@NotTransactional 以及 @Rollback。 

下面来看一下测试相关注解的简单说明: 
@TransactionConfiguration使用在类级别上,里面有两个属性,transactionManager 指定事物管理器的名字,默认的名称为:transactionManager;defaultRollback 配置全局默认的事务回滚,默认为:false。 

@BeforeTransaction和@AfterTransaction可见是在需要事物的测试方法执行前后调用,和JUnit4中@Before、@After注解类型,当时前者会忽略声明了@NotTransactional注解的测试方法。 

@NotTransactional修饰那些不需要事物的测试方法。 

@Rollback可以改变测试方法的回滚方式,例如@Rollback(true)可以是测试方法的事物设置为执行完后事物马上回滚。 
还有一些注解的使用方法可以参考Spring Reference。

posted @ 2018-11-05 14:31  十月围城小童鞋  阅读(1899)  评论(0编辑  收藏  举报