`
yaerfeng1989
  • 浏览: 233995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

原创整理不易,转载请注明出处:Spring整合JUnit框架进行单元测试代码使用详解

代码下载地址:http://www.zuidaima.com/share/1775457756285952.htm

一、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();

      例如:

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


请 注意要加载的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),代码如下:
 

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

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:

public class MyTest extends AbstractDependencyInjectionSpringContextTests {
    ProductManager productManager;

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

    public void testGetProduct() {
       assertEquals("tomson",productManager.getProductByName("tomson").getName());
    }
   

    //通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX)
    public void setProductManager(ProductManager productManager) {
       this.productManager = productManager;
    }
}

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

public class MyTest extends AbstractDependencyInjectionSpringContextTests {
   ProductManager productManager;

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

   public void onSetUp() {
       productManager = (ProductManager) applicationContext.getBean("productManager");
   }

   public void testGetProduct() {
       assertEquals("tomson",productManager.getProductByName("tomson").getName());
   }
 
}

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

4
1
分享到:
评论
1 楼 finallygo 2014-05-08  
现在一般都是用注解吧,
@Runner(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"});

相关推荐

    SSM框架中测试单元的使用 spring整合Junit过程详解

    SSM框架中测试单元的使用是指在SSM框架中使用Spring整合JUnit来进行单元测试。单元测试是软件测试的一个重要部分,它可以帮助我们检测代码中的错误和bug,从而提高代码的质量和可靠性。在SSM框架中,我们可以使用...

    Spring Boot 单元测试和集成测试实现详解

    本文详细介绍了 Spring Boot 中的单元测试和集成测试的实现细节,包括使用 JUnit 和 Hamcrest 框架来进行单元测试,以及使用@SpringBootTest 注解来标记集成测试。这对于学习 Spring Boot 和测试有重要参考价值。

    详解spring cloud如何使用spring-test进行单元测试

    Spring Cloud 提供了多种方式来对应用程序进行单元测试,例如使用 Spring Test 框架、JUnit 框架等。本文将主要介绍如何使用 Spring Test 框架对 Spring Cloud 应用程序进行单元测试。 使用 Spring Test 框架进行...

    Spring整合Junit的使用详解

    Spring整合Junit的使用详解 ...Spring整合Junit的使用详解是一个非常重要的知识点,通过使用Spring-test模块,我们可以将Spring框架与Junit框架进行整合,从而实现对Spring应用程序的正确性测试。

    javaweb中.java文件测试需要的框架(junit测试).rar

    **JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1. **测试注解**:如`@Test`,标记测试方法,`@Before`和`@After`用于定义在每个测试方法之前和之后运行的初始化和清理代码。 2. **断言**...

    junit参数化测试的使用方法

    JUnit是Java开发中最常用的单元测试框架之一,它提供了一种简单的方式来编写可重复执行的测试案例。随着软件复杂度的增加,对于某些功能模块可能需要多次使用不同的输入数据进行验证。此时,传统的JUnit测试方法就...

    Junit单元测试(很经典)

    在Java世界里,Junit是最广泛使用的单元测试框架,它为Java程序员提供了简洁易用的API来进行单元测试。本篇文章将深入探讨Junit的基础、中级和高级应用。 ### 基础篇 1. **安装与配置**:Junit通常作为Maven或...

    spring3 and junit4

    JUnit4则是单元测试的首选工具,它使得测试代码编写更加简洁,可读性更强。本文将深入探讨这两个关键组件,并结合《Effective Unit Testing》一书中的精华,为开发者提供全面的理论和实践指导。 1. Spring3.2.8框架...

    spring配置实例详解代码和测试

    在测试方面,Spring提供了`@ContextConfiguration`和`@Autowired`等注解来协助进行单元测试和集成测试。例如: ```java @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:...

    spring-demo15-测试.zip

    本示例“spring-demo15-测试”主要聚焦于Spring框架中的测试部分,通过一系列的实例,深入探讨如何有效地进行Spring应用的单元测试和集成测试。 1. **Spring测试模块** Spring框架提供了内置的测试支持,包括`...

    Spring+hibernate 单元测试

    ### Spring+Hibernate 单元测试详解 #### 一、Spring 2.5 TestContext 测试框架简介 Spring 2.5 版本引入了一个全新的基于注解的测试框架——TestContext,该框架与之前的测试框架相比有着显著的区别。TestContext...

    junit+hibernate3.2+spring2.5工程

    在软件开发领域,测试是不可或缺的一部分,而Java开发中的Junit框架则是单元测试的重要工具。结合持久层框架Hibernate和依赖注入框架Spring,可以构建出高效、可维护的业务应用。本工程“junit+hibernate3.2+spring...

    spring_maven_mybatis3_junit4

    - 使用JUnit4编写单元测试,测试Service层和DAO层的功能,确保代码的正确性。 本项目中,开发者已经完成上述步骤,并且所有测试都已通过,这意味着整个系统可以正常运行,实现了基本的CRUD操作。这对于初学者来说是...

    spring框架各jar包详解

    Spring 框架各 jar 包详解 Spring 框架中有许多 jar 包,每个 jar 包都有其特定的作用和使用场景。了解每个 jar 包的作用和使用场景对于正确地使用 Spring 框架非常重要。本文将对 Spring 框架中常用的 jar 包进行...

    千锋最新版spring6.0框架GA版详解.pdf

    使用JUnit单元测试框架结合Spring Test模块来编写针对Spring组件的测试用例。 2. **Spring Test模块提供的支持** Spring Test模块提供了多种测试支持,如MockMvc用于模拟HTTP请求,以及各种测试注解如@RunWith...

    spring+springMVC+Mybatis框架整合

    使用JUnit和Mockito等工具进行单元测试,确保每个组件的正确性。在SSM框架中,Spring Test提供了一套完整的测试支持,可以方便地测试Spring的bean和依赖注入。 SSM框架的整合不仅简化了开发工作,也提高了代码的可...

    spring框架.pfd

    Spring框架支持JUnit等测试框架,使得在开发过程中进行单元测试变得容易。接下来,配置Hibernate和Transaction,这涉及到在Spring的`applicationContext.xml`文件中定义数据源、事务管理器以及Hibernate的...

    org.springframework.test-3.0.2.RELEASE.jar

    3. **Mockito与Spring集成**:Spring测试模块可以与Mockito等模拟框架集成,方便进行行为驱动开发(BDD)和单元测试。 4. **SpringJUnit4ClassRunner**与**SpringRunner**:这些测试运行器使得JUnit测试类可以利用...

Global site tag (gtag.js) - Google Analytics