您的位置:首页 > 数据库

JUnit学习笔记19---对数据库应用程序进行单元测试3

2010-02-15 18:34 706 查看
      4.数据库集成单元测试的编写

     执行数据库集成单元测试是指在连着一个数据库的情况下执行单元测试。前面的测试都是在数据库访问代码脱离数据库的情况下进行的,而在实际的链接数据的情况下,可以让你检查如下内容:

集成问题

存储过程

触发设置

约束运行

完整引用

   4.1满足数据库集成测试的要求

   你需要编写集成测试,需要在框架内有两个功能:

将测试数据预置进数据库的能力

从运行的容器内部进行测试的能力

  为此,可以选用两种框架来完成此项任务:Cactus以及DbUnit。Cactus允许你从容器的内部开始测试,DbUnit是一个数据库单元测试框架,它有以下两个特征:具有预先将数据放入数据库的能力,具有测试后将数据库的内容和参考数据相比较的能力。

  因为你要在容器的内部进行测试,所以我们要给管理应用程序挑选一个J2EE容器和一个数据库。JBoss和Hypersonic SQL是两个免费且公开源代码的工具。在这里,是个不错的选择,因为本章不包括如何建立数据库——它是关于测试数据库的。

  构建工具是Ant,来运行整个环境。将从Ant启动Cactus并使用Cactus/Ant集成模块。

  下面将继续以管理应用程序为例。还将为JdbcDataAccessManager的execute方法编写一个单元测试,在上一章,我们曾描述了使用Mock 的方法为它编写一个单元测试,但是这次我们使用Cactus。

  4.2预设数据库数据

    下面的代码示出了使用JdbcDataAccessManager类的execute方法的Cactus测试

package junitbook.database;

import java.util.Collection;
import java.util.Iterator;

import javax.naming.InitialContext;

import org.apache.cactus.ServletTestCase;
import org.apache.commons.beanutils.DynaBean;
import org.dbunit.database.DatabaseDataSourceConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

public class TestJdbcDataAccessManagerIC extends ServletTestCase
{
protected void setUp() throws Exception
{
}

public void testExecuteOk() throws Exception
{
JdbcDataAccessManager manager =
new JdbcDataAccessManager();

Collection result =
manager.execute("SELECT * FROM CUSTOMER");

Iterator beans = result.iterator();

assertTrue(beans.hasNext());
DynaBean bean1 = (DynaBean) beans.next();
assertEquals("John", bean1.get("firstname"));
assertEquals("Doe", bean1.get("lastname"));

assertTrue(!beans.hasNext());
}
}

通过派生自Cactus的ServletTestCase类,在一个servlet的上下文中运行测试

与先前的mock objects测试的主要区别在于,你不用再模拟DataAccessManager接口,你将用实际的实现了访问数据库

连接到数据库

package junitbook.database;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.commons.beanutils.RowSetDynaClass;

public class JdbcDataAccessManager implements DataAccessManager
{
private DataSource dataSource;

public JdbcDataAccessManager() throws NamingException
{
this.dataSource = getDataSource();
}

protected DataSource getDataSource() throws NamingException
{
InitialContext context = new InitialContext();
DataSource dataSource =
(DataSource) context.lookup("java:/DefaultDS");
return dataSource;
}

protected Connection getConnection() throws SQLException
{
return this.dataSource.getConnection();
}

public Collection execute(String sql) throws Exception
{
Connection connection = getConnection();

// For simplicity, we'll assume the SQL is a SELECT query
ResultSet resultSet =
connection.createStatement().executeQuery(sql);

RowSetDynaClass rsdc = new RowSetDynaClass(resultSet);

resultSet.close();
connection.close();

return rsdc.getRows();
}
}


当你在TestJdbcDataAccessManagerIC类中执行new JdbcDataAccessManager()时,就会在JNDI中查找数据源。注意你使用的是java:/DefaultDS JNDI关键字来查找数据源。这里JBoss定义了一个Hypersonic DataSource。如果你运行这样的测试,还是通不过,因为没有给数据源预置正确的数据。

设置数据库数据
   在TestCase的setUp方法中使用DbUnit,从而使每次测试前数据都被正确的预置了。

package junitbook.database;

import java.util.Collection;
import java.util.Iterator;

import javax.naming.InitialContext;

import org.apache.cactus.ServletTestCase;
import org.apache.commons.beanutils.DynaBean;
import org.dbunit.database.DatabaseDataSourceConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

public class TestJdbcDataAccessManagerIC extends ServletTestCase
{
protected void setUp() throws Exception
{
IDatabaseConnection connection =
new DatabaseDataSourceConnection(new InitialContext(),
"java:/DefaultDS");

IDataSet dataSet = new FlatXmlDataSet(
this.getClass().getResource(
"/junitbook/database/data.xml"));

try
{
DatabaseOperation.CLEAN_INSERT.execute(connection,
dataSet);
}
finally
{
connection.close();
}
}

public void testExecuteOk() throws Exception
{
JdbcDataAccessManager manager =
new JdbcDataAccessManager();

Collection result =
manager.execute("SELECT * FROM CUSTOMER");

Iterator beans = result.iterator();

assertTrue(beans.hasNext());
DynaBean bean1 = (DynaBean) beans.next();
assertEquals("John", bean1.get("firstname"));
assertEquals("Doe", bean1.get("lastname"));

assertTrue(!beans.hasNext());
}
}

以DataSource创建一个数据库连接,用java:/DefaultDS JNDI名字作为DataSource的限定

加载XML数据文件

采用CLEAN_INSERT策略将它的内容加载到数据库中。该策略确保数据库中的内容与data.xml文件的内容一致。

关闭数据库

data.xml

<dataset>
<CUSTOMER FIRSTNAME="John" LASTNAME="Doe"/>
</dataset>


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: