单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量。这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的">企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate、Struts 等的集成。那么,有个问题,在普遍使用 Spring 的应用程序中,我们如何去做单元测试?或者说,我们怎么样能高效的在 Spring 生态系统中实现各种单元测试手段?这就是本文章要告诉大家的事情。
单元测试目前主要的框架包括 Junit、TestNG,还有些 MOCK 框架,例如 Jmock、Easymock、PowerMock 等,这些都是单元测试的利器,但是当把他们用在 Spring 的开发环境中,还是那么高效么?还好,Spring 提供了单元测试的强大支持,主要特性包括:
支持主流的
测试框架 Junit 和 TestNG 支持在测试类中使用依赖注入 Denpendency Injection 支持测试类的自动化事务管理 支持使用各种注释标签,提高开发效率和代码简洁性 Spring 3.1 更是支持在测试类中使用非 XML 配置方法和基于 Profile 的 bean 配置模式
通过阅读本文,读者能够快速的掌握基于 Spring TestContext 框架的测试方法,并了解基本的实现原理。本文将提供大量测试标签的使用方法,通过这些标签,开发人员能够极大的减少编码工作量。OK,现在让我们开始 Spring 的测试之旅吧!
原来我们是怎么做的
这里先展示一个基于 Junit 的单元测试,这个单元测试运行在基于 Spring 的应用程序中,需要使用 Spring 的相关配置文件来进行测试。相关类图如下:
数据库表
假设有一个员工账号表,保存了员工的基本账号信息,表结构如下:
ID:整数类型,唯一标识 NAME:字符串,登录账号 SEX:字符串,性别 AGE:字符串,年龄
假设表已经建好,且内容为空。
你需要引入的 jar 包括:
cglib-nodep-2.2.3.jar commons-logging.jar hsqldb.jar Junit-4.5.jar log4j-1.2.14.jar Spring-asm-3.2.0.M1.jar Spring-beans-3.2.0.M1.jar Spring-context-3.2.0.M1.jar Spring-core-3.2.0.M1.jar Spring-expression-3.2.0.M1.jar Spring-jdbc-3.2.0.M1.jar Spring-test-3.2.0.M1.jar Spring-tx-3.2.0.M1.jar testng-6.8.jar
其中的 hsqldb 是我们测试用数据库。
测试工程目录结构和依赖 jar 包
在 Eclipse 中,我们可以展开工程目录结构,看到如下图所示的工程目录结构和依赖的 jar 包列表:
图 1. 工程目录结构