当前页面: 开发资料首页 → J2EE 专题 → 设计自己的DbUnit
摘要: 在数据库测试中,因为我们力求将每个TestCase中众多的测试方法完全隔离起来,不会因为一个测试方法因测试增加、删除功能而影响到另一个测试方法,这样,在每一个测试之前,数据库的状态是否稳定,甚至是完全不变,就显得很重要了。而这点,正是数据库测试的难点。
package com.sarkuya.util.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlRunner {
static {
try {
Class.forName("org.hsqldb.jdbcDriver");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
public static void executeUpdate(String sql) {
Connection conn;
Statement stmt;
try {
conn = DriverManager.getConnection("jdbc:hsqldb:mem:testingdb", "sa", "");
stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.close();
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public static boolean isUndeletableForSelfReference (String 表名, String 字段名) {
Connection conn;
Statement stmt;
boolean result = true;
try {
conn = DriverManager.getConnection("jdbc:hsqldb:mem:testingdb", "sa", "");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select count(*) from " + 表名 + " where " + 字段名 + " is not null");
rs.next();
if (rs.getInt(1) != 0) {
result = true;
}
else {
result = false;
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return result;
}
protected void setUp() throws Exception {
SqlRunner.executeUpdate("insert into 组织分类 values(1, '教育系统')");
SqlRunner.executeUpdate("insert into 组织分类 values(2, '商贸系统')");
SqlRunner.executeUpdate("insert into 组织分类 values(3, '供应商家')");
SqlRunner.executeUpdate("insert into 组织分类 values(4, '政府')");
SqlRunner.executeUpdate("insert into 组织 values(1, '中国贸易部', '北京三环路558号', 2, null)");
SqlRunner.executeUpdate("insert into 组织 values(2, '北京贸易厅', '北京四环路8号', 2, 1)");
SqlRunner.executeUpdate("insert into 组织 values(3, '河北高科技技术服务有限公司', '石家庄市白龙路23号', 3, null)");
SqlRunner.executeUpdate("insert into 组织 values(4, '四川珠宝有限公司', '成都市蓝天路56号', 3, null)");
SqlRunner.executeUpdate("insert into 组织 values(5, '北京昌平贸易局', '北京五环路18号', 2, 2)");
SqlRunner.executeUpdate("insert into 部门 values(1, '财务科', 2)");
SqlRunner.executeUpdate("insert into 部门 values(2, '市场部', 2)");
SqlRunner.executeUpdate("insert into 部门 values(3, '人事部', 2)");
}
protected void tearDown() throws Exception {
SqlRunner.executeUpdate("delete from 部门");
while (SqlRunner.isUndeletableForSelfReference("组织", "上级组织编号")) {
SqlRunner.executeUpdate("delete from 组织 where 上级组织编号 is not null and 编号 not in (select 上级组织编号 from 组织 where 上级组织编号 is not null)");
}
SqlRunner.executeUpdate("delete from 组织");
SqlRunner.executeUpdate("delete from 组织分类");
}
assertEquals(5, 组织Service.get组织数量());