本文翻译自《JUnit in Action 2nd Edition》第十六章, 原书见
《DbUnit测试一 数据库测试挑战》附件。
二、DbUnit
DbUnit(http://www.dbunit.org) 是一个Junit的扩展,由Manuel LaFlamme于2002年创建,在Java测试还处于幼年的时候,没有什么框架关注数据库测试。在那个时候Richard Dalalaway写了一篇博文《数据库代码单元测试》,这就是DbUnit创作灵感来源。
从那时候开始,DbUnit变成了数据库测试的JAVA框架,它的开发也有所起伏。在一个高峰期之后(基本代码库已经创建好了),它面临了一段长时间的低落。幸运的是,很多新的开发者加入了,在这期间,这本书也写好了,几个新的版本已经发布,提供了很多改进,也修正了一些bug。
DbUnit有数百个类和接口。即使如此多类,DbUnit的使用大概就是从数据库获取数据和添加数据,这些数据使用dataset表示(更特别一点,它就是实现了dataset接口的类)。
下一节将看下dataset的基本使用和DbUnit其他的特性。
2.1 简单的应用程序
这一节主要是讲使用DbUnit测试JAVA应用程序的持久化层。为了方便,这层仅仅定义了一个接口,如下[Listing 1]所示:
[Listing 1]: DAO interface used in the examples
public interface UserDao {
long addUser(User user) throws SQLException;
User getUserById(long id) throws SQLException;
}
这个DAO接口(使用简单的JDBC)的实现没有写在这里,但是可以去本书的网站下载。User对象是一个简单的POJO, 如下[Listing 2]所示:
[Listing 2]: Domain model used in the examples
public class User {
private long id;
private String username;
private String firstName;
private String lastName;
// getters and setters omitted
}
User对象在数据库中对应users表,创建表的语句如下[Listing 3]所示:
[Listing 3]: SQL script that creates the users table
CREATE TABLE users (id INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH
1), username VARCHAR(10), first_name VARCHAR(10), last_name VARCHAR(10) )
最后一点,本例讲使用HSQLDB数据库,因为它是基于JAVA的,不需要更多的配置。HSQLDB是非常灵活的,它可以作为客户端、嵌入式运行,使用硬盘或者内存。最简单最快的方式是使用内存嵌入式数据库,这也是本例所使用这种模式。
2.2 创建DbUnit运行这个简单的程序
DbUnit本身仅有一个jar,唯一需要的外部依赖就是logging框架-SLF4J(Sample Logging Facade for Java). SLF4J需要2个jar: slf4j-api.jar(它包含slf4j框架的接口)和slf4j-nop.jar(它不记录任何东西;更多的内容将在以后讨论)。DbUnit要去连接数据库,当然要添加JDBC驱动到classpath(在本例中它就是hsqldb.jar).
这个简单的程序可以使用两种“风格”,Maven 和 Ant.使用 Maven 运行的命令是 "maven clean test". 类似地,使用Ant运行的命令是"Ant clean test". 这个程序用两种Eclipse project的方式:一种使用必要的库,另外一种使用DbUnit工程本身。