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

Spring整合JUnit框架进行单元测试代码使用详解

时间:2015-10-28 01:36:13      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

【转】Spring整合JUnit框架进行单元测试代码使用详解

转自 http://blog.csdn.net/yaerfeng/article/details/25187775

感谢博主 :云淡风轻 、仅此一抹

一、Spring提供的JUnit框架扩展:

   1. AbstractSpringContextTests:spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元测试,它是spring内部设计使用到的类
   2. AbstractDependencyInjectionSpringContextTests:这是AbstractSpringContextTests的直接子类,支持依赖spring上下文的测试类,这个类不支持事务。
   3. AbstractTransactionalSpringContextTests:这 是 AbstractDependencyInjectionSpringContextTests的直接子类,这个类一般应用在事务相关的测试中,一旦 完成每个测试它就会正常地回滚事务,不会真正更新数据库,若要手动设置事务相关操作,你可以重载onSetUpInTransaction 和 onTearDownInTransaction方法,以便手工开始并提交事务,或者调用setComplete()方法。这个类也可以在没有事务的 情况下,使用这个类。
   4. AbstractTransactionalDataSourceSpringContextTests:这 是 AbstractTransactionalSpringContextTests的直接子类,它使用了Spring的基于JDBC 的 jdbcTemplate工具类,支持数据库级别的事务。

二、如何在你的TestCase Class里取得spring context

     你的TestCase Class必须继承的是上述四个AbstractXXXSpringContextTests中的其中一个,那么就必须实现下面这个方法来取得spring context:

      protected abstract String[] getConfigLocations();

    例如:

  1. public String[] getConfigLocations() {  
  2.      String[] configLocations = { "applicationContext.xml","hibernate-context.xml" };  
  3.      return configLocations;  
  4.  }  


请 注意要加载的context xml file的路径问题:上述的代码是基于classpath,因此applicationContext.xml 和hibernate- context.xml必须放在classpath里(方法一是把xml files放到WEB-INF/classes目录 下,另一种方法就是在project properties里把xml files的路径加到classpath里)

那么如果你一定要把context xml files放到WEB-INF目录下,也是可以的,那么应该基于file(基于file的相对路径是相对于project root folder),代码如下:
 

  1. public String[] getConfigLocations() {  
  2.    String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"};  
  3.    return configLocations;  
  4. }  

AbstractXXXSpringContextTests就会根据根据getConfigLocations方法返回的context xml 位置的数组来加载并且对加载的Context提供缓存。这是非常重要的,因为如果你在从事一个大项目时,启动时间可能成为一个问题--这不 是 Spring自身的开销,而是被Spring容器实例化的对象在实例 化自身时所需要的时间。例如,一个包括50-100个Hibernate映射文 件的项目可能需要10-20秒的时间来加载上述的映射文件,如果在运行每个测试fixture里的每个测试案例前都有这样的开销,将导致整个测试工作的延 时,最终有可能(实际上很可能)降低效率。

在某种极偶然的情况下,某个测试可能“弄脏”了配置场所,并要求重新加载--例如改变一个bean的定义或者一个应用对象的状态--你可以调 用 AbstractDependencyInjectionSpringContextTests 上的 setDirty() 方法来重新加载配置并 在执行下一个测试案例前重建application context

当类 AbstractDependencyInjectionSpringContextTests(及其子类)装载你的 Application Context时,你可以通过Setter方法来注入你想要的来自context的bean,而不需要显式的调 用 applicationContext.getBean(XXX)。因 为 AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指 定的配置文件中帮你自动注入

下面的例子就是通过setter方法来获得context里的ProductManager bean:

  1. public class MyTest extends AbstractDependencyInjectionSpringContextTests {  
  2.     ProductManager productManager;  
  3.   
  4.     public String[] getConfigLocations() {  
  5.         String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };  
  6.         return configLocations;  
  7.     }  
  8.   
  9.     public void testGetProduct() {  
  10.        assertEquals("tomson",productManager.getProductByName("tomson").getName());  
  11.     }  
  12.      
  13.   
  14.     //通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX)  
  15.     public void setProductManager(ProductManager productManager) {  
  16.        this.productManager = productManager;  
  17.     }  
  18. }  

但是如 果context里有多个bean都定义为一个类型(例如有多个bean都是ProductManager class类型的),那么对这 些bean就无法通过setter方法来自动依赖注入(因为有多个bean同一个类型,不知要自动注入哪个)。在这种情况下 你需要显示的调用 applicationContext.getBean(XXX)来注入。如:
 

  1. public class MyTest extends AbstractDependencyInjectionSpringContextTests {  
  2.    ProductManager productManager;  
  3.   
  4.    public String[] getConfigLocations() {  
  5.       String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };  
  6.       return configLocations;  
  7.    }  
  8.   
  9.    public void onSetUp() {  
  10.        productManager = (ProductManager) applicationContext.getBean("productManager");  
  11.    }  
  12.   
  13.    public void testGetProduct() {  
  14.        assertEquals("tomson",productManager.getProductByName("tomson").getName());  
  15.    }  
  16.    
  17. }  

如果你的TestCase不使用依赖注入,只要不定义任何setters方法即可。或者你可以继 承 AbstractSpringContextTests --这个 org.springframework.test 包中的根类,而不是继承 AbstractDependencyInjectionSpringContextTests(及其子类)。这是因 为 AbstractSpringContextTests 只包括用来加载Spring Context的便利方法但没有自动依赖注入的功能。

 

Spring整合JUnit框架进行单元测试代码使用详解

标签:

原文地址:http://www.cnblogs.com/zhouzf007/p/4916121.html

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