资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
使用使用 Spring 2.5 TestContext 测试框架测试框架陈 雄华(quickselect163.com), 技术总监, 宝宝淘网络科技有限公司 简介:简介: Spring 2.5 TestContext 测试框架用于测试基于 Spring 的程序,TestContext 测试框 架和低版本 Spring 测试框架没有任何关系,是一个全新的基于注解的测试框架,为 Spring 推荐使用该测试框架。 本文的标签本文的标签: java-spring, spring-test, textcontext 标记本文! 发布日期:发布日期: 2008 年 3 月 28 日 级别:级别: 初级 访问情况访问情况 2978 次浏览 建议:建议: 1 (查看或添加评论) 平均分 (共 3 个评分 )概述 Spring 2.5 相比于 Spring 2.0 所新增的最重要的功能可以归结为以下 3 点: 基于注解的 IoC 功能; 基于注解驱动的 Spring MVC 功能; 基于注解的 TestContext 测试框架。 Spring 推荐开发者使用新的基于注解的 TestContext 测试框架,本文我们将对此进行详细 的讲述。 低版本的 Spring 所提供的 Spring 测试框架构在 JUnit 3.8 基础上扩展而来,它提供了若 干个测试基类。而 Spring 2.5 所新增的基于注解的 TestContext 测试框架和低版本的测试 框架没有任何关系。它采用全新的注解技术可以让 POJO 成为 Spring 的测试用例,除了 拥有旧测试框架所有功能外,TestContext 还添加了一些新的功能,TestContext 可以运行 在 JUnit 3.8、JUnit 4.4、TestNG 等测试框架下。回页首 直接使用 JUnit 测试 Spring 程序存在的不足 在拙作精通 Spring 2.x 企业应用开发详解一书中,笔者曾经指出如果直接使用 JUnit 测试基于 Spring 的程序,将存在以下 4 点明显的不足: 导致导致 Spring 容器多次初始化问题:容器多次初始化问题:根据 JUnit 测试用例的调用流程,每执行一个 测试方法都会重新创建一个测试用例实例并调用其 setUp() 方法。由于在一般情况下, 我们都在 setUp() 方法中初始化 Spring 容器,这意味着测试用例中有多少个测试方法, Spring 容器就会被重复初始化多少次。 需要使用硬编码方式手工获取需要使用硬编码方式手工获取 Bean:在测试用例中,我们需要通过 ApplicationContext.getBean() 的方法从 Spirng 容器中获取需要测试的目标 Bean,并且 还要进行造型操作。 数据库现场容易遭受破坏:数据库现场容易遭受破坏:测试方法可能会对数据库记录进行更改操作,破坏数据 库现场。虽然是针对开发数据库进行测试工作的,但如果数据操作的影响是持久的, 将会形成积累效应并影响到测试用例的再次执行。举个例子,假设在某个测试方法中 往数据库插入一条 ID 为 1 的 t_user 记录,第一次运行不会有问题,第二次运行时, 就会因为主键冲突而导致测试用例执行失败。所以测试用例应该既能够完成测试固件业务功能正确性的检查,又能够容易地在测试完成后恢复现场,做到踏雪无迹、雁过 无痕。 不容易在同一事务下访问数据库以检验业务操作的正确性:不容易在同一事务下访问数据库以检验业务操作的正确性:当测试固件操作数据库 时,为了检测数据操作的正确性,需要通过一种方便途径在测试方法相同的事务环境 下访问数据库,以检查测试固件数据操作的执行效果。如果直接使用 JUnit 进行测试, 我们很难完成这项操作。 Spring 测试框架是专门为测试基于 Spring 框架应用程序而设计的,它能够让测试用例非 常方便地和 Spring 框架结合起来,以上所有问题都将迎刃而解。回页首 一个需要测试的 Spring 服务类 在具体使用 TextContext 测试框架之前,我们先来认识一下需要测试的 UserService 服务 类。UserService 服务类中拥有一个处理用户登录的服务方法,其代码如下所示:清单清单1. UserService.java 需要测试的服务类需要测试的服务类package com.baobaotao.service;import com.baobaotao.domain.LoginLog; import com.baobaotao.domain.User; import com.baobaotao.dao.UserDao; import com.baobaotao.dao.LoginLogDao;public class UserServiceprivate UserDao userDao;private LoginLogDao loginLogDao;public void handleUserLogin(User user) user.setCredits( 5 + user.getCredits();LoginLog loginLog = new LoginLog();loginLog.setUserId(user.getUserId();loginLog.setIp(user.getLastIp();loginLog.setLoginTime(user.getLastVisit();userDao.updateLoginInfo(user);loginLogDao.insertLoginLog(loginLog);/省略 get/setter 方法 UserService 需要调用 DAO 层的 UserDao 和 LoginLogDao 以及 User 和 LoginLog 这 两个 PO 完成业务逻辑,User 和 LoginLog 分别对应 t_user 和 t_login_log 这两张数据库 表。在用户登录成功后调用 UserService 中的 handleUserLogin() 方法执行用户登录成功后的业 务逻辑: 登录用户添加 5 个积分(t_user.credits) ; 登录用户的最后访问时间(t_user.last_visit)和 IP(t_user.last_ip)更新为当前值; 在日志表中(t_login_log)中为用户添加一条登录日志。 这是一个需要访问数据库并存在数据更改操作的业务方法,它工作在事务环境下。下面是 装配该服务类 Bean 的 Spring 配置文件:清单清单2. applicationContext.xml:Spring 配置文件,放在类路径下配置文件,放在类路径下UserService 所关联的 DAO 类和 PO 类都比较简单,请参看本文附件的程序代码。在着 手测试 UserSerivce 之前,需要将创建数据库表,你可以在附件的 schema 目录下找到相 应的 SQL 脚本文件。回页首 编写 UserService 的测试用例 下面我们为 UserService 编写一个简单的测试用例类,此时的目标是让这个基于 TestContext 测试框架的测试类运行起来,我们将在后面逐步完善这个测试用例。清单清单3.TestUserService.java: 基于注解的测试用例基于注解的测试用例package com.baobaotao.service;import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests; import org.springframework.test.context.ContextConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.junit.Test; import com.baobaotao.domain.User;import java.util.Date;ContextConfiguration / public class TestUserService extends AbstractTransactionalJUnit4SpringContextTests Autowired /private UserService userService;Test /public void handleUserLogin()User user = new User();user.setUserId(1);user.setLastIp(“127.0.0.1“);Date now = new Date();user.setLastVisit(now.getTime();userService.handleUserLogin(user); 这里,我们让 TestUserService 直接继承于 Spring 所提供的 AbstractTransactionalJUnit4SpringContextTests 的抽象测试类,稍后本文将对这个抽象测试 类进行剖析,这里你仅须知道该抽象测试类的作用是让 TestContext 测试框架可以在 JUnit 4.4 测试框架基础上运行起来就可以了。 在 处,标注了一个类级的 ContextConfiguration 注解,这里 Spring 将按 TestContext 契约查找 classpath:/com/baobaotao/service/TestUserService-context.xml 的 Spring 配置文件,并使用该配置文件启动 Spring 容器。ContextConfiguration 注解有以 下两个常用的属性: locations:可以通过该属性手工指定 Spring 配置文件所在的位置,可以指定一个或多个 Spring 配置文件。如下所示: ContextConfiguration(locations=“xx/yy/beans1.xml”,” xx/yy/beans2.xml”) inheritLocations:是否要继承父测试用例类中的 Spring 配置文件,默认为 true。如下面的 例子: ContextConfiguration(locations=“base-context.xml“)public class BaseTest / .ContextConfiguration(locations=“extended-context.xml“)public class ExtendedTest extends BaseTest / .如果 inheritLocations 设置为 false,则 ExtendedTest 仅会使用 extended-context.xml 配置 文件,否则将使用 base-context.xml 和 extended-context.xml 这两个配置文件。 处的 Autowired 注解让 Spring 容器自动注入 UserService 类型的 Bean。而在 处标注的 Test 注解则让 handleUserLogin() 方法成为一个 JUnit 4.4 标准的测试方法, Test 是 JUnit 4.4 所定义的注解。 在运行 TestUserService 测试类之前,让我们先看一下 TestUserService-context.xml 配置文 件的内容:清单清单 4.TestUserService 所引用的所引用的 Spring 配置文件配置文件在 处引入了清单 1 中定义的 Sp
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号