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

【转】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. public String[] getConfigLocations() {
  4. String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };
  5. return configLocations;
  6. }
  7. public void testGetProduct() {
  8. assertEquals("tomson",productManager.getProductByName("tomson").getName());
  9. }
  10. //通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX)
  11. public void setProductManager(ProductManager productManager) {
  12. this.productManager = productManager;
  13. }
  14. }

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

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

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

时间: 2024-10-12 11:55:46

Spring整合JUnit框架进行单元测试代码使用详解的相关文章

Spring 整合 Hibernate 时启用二级缓存实例详解

写在前面: 1. 本例使用 Hibernate3 + Spring3: 2. 本例的查询使用了 HibernateTemplate: 1. 导入 ehcache-x.x.x.jar 包: 2. 在 applicationContext.xml 文件中找到 sessionFactory 相应的配置信息并在设置 hibernateProperties 中添加如下代码: ? 1 2 3 4 5 6 <!-- 配置使用查询缓存 --> <prop key="hibernate.cach

eclipse上使用JUnit框架进行单元测试

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写. 先 简单解释一下什么是Annotation,这个单词一般是翻译成元数据.元数据是什么?元数据就是描述数据的数据.也就是说,这个东西在Java里面可以 用来和public.static等关键字一样来修饰类名.方法名.变量名.修饰的作用描述这个数据是做什么用的,差不多和public描述这个数据是公 有的一样.想具体了解可以看Core    Java2.废话不多说了,直接进入正题

Spring整合junit测试

本节内容: Spring整合junit测试的意义 Spring整合junit测试 一.Spring与整合junit测试的意义 在没整合junit之前,我们在写测试方法时,需要在每个方法中手动创建容器,获取对象,比如下面的代码,红色部分都是重复的代码.如果要测试很多功能的话,每次都得手动去创建容器,很麻烦.如果你测试的两个功能中用到某个相同的对象,获取对象的代码也得写一遍. public class test { @Test public void test1(){ //1.创建容器对象(创建Sp

java 框架-spring 整合 quartz 框架 service层 注入不了job 类

    1.  spring  + quartz  启动 停止 添加job 功能  一 maven添加quartz  的jar 二 代码区 applicationContext.xml  导入 quartz.xml   <import resource="classpath:spring/quartz.xml"/> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns

【Spring】Spring系列7之Spring整合MVC框架

7.Spring整合MVC框架 7.1.web环境中使用Spring 7.2.整合MVC框架 目标:使用Spring管理MVC的Action.Controller 最佳实践参考:http://www.itnose.net/detail/6102205.html http://wenku.baidu.com/link?url=ABQ1RvCWEAVObPpqJKWudD-UPc4YyH1MQQlu11fpCeoKexpDLxc2Lgs1c_Fh8HuqshxBfYxNfte6wU2PzdyzcSH

【SSH框架】系列之 Spring 整合 Hibernate 框架

1.SSH 三大框架整合原理 Spring 与 Struts2 的整合就是将 Action 对象交给 Spring 容器来负责创建. Spring 与 Hibernate 的整合就是将 SessionFactory 交给 Spring 容器来负责维护,并且 Spring 容器负责 Session 维护以及相关的 AOP 事务. 2.Spring 整合 Hibernate 框架 (1).新建 web 项目,导入 Spring 和 Hibernate 框架所需要的 jar 包,如下图所示: (2).

spring整合shiro框架

上一篇文章已经对shiro框架做了一定的介绍,这篇文章讲述使用spring整合shiro框架,实现用户认证已经权限控制 1.搭建环境 这里不在赘述spring环境的搭建,可以简单的搭建一个ssm框架,整合后进行简单的测试 1.1 添加依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3

Spring整合junit的配置

配置步骤: 1.导入Spring整合Junit的jar(坐标): <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.2.RELEASE</version> <scope>test</scope> </dependency> 2.使用Ju

Spring基于事件驱动模型的订阅发布模式代码实例详解

代码下载地址:http://www.zuidaima.com/share/1791499571923968.htm 原文:Spring基于事件驱动模型的订阅发布模式代码实例详解 事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): 当目标发送改变(发布),观察者(订阅者)就可以接收到改变: 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的