dbunithelper.java
来自「anewssystem新闻发布系统集成使用了spring hibernate f」· Java 代码 · 共 352 行
JAVA
352 行
package anni.core.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Properties;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.dbunit.operation.DatabaseOperation;
/**
* 仅暴露Dbunit对Excel的支持.
* 是因为几种数据提供方案中,Excel编辑数据最容易,在实践中被使用的最广泛。 支持每次Setup是否清空数据的选择
* 来自www.springside.org.cn.
*
* @author Anders.Lin
* @author Lingo
* @since 2007-06-01
* @version 1.0
*/
public class DbunitHelper {
// statis fields
//
/** * 默认配置文件名. */
public static final String DEFAULT_CONFIG_FILE = "dbunit.properties";
/** * 默认的jdbc驱动. */
public static final String DEFAULT_DRIVER = "org.hsqldb.jdbcDriver";
/** * 默认的数据库密码. */
public static final String DEFAULT_PASS = "";
/** * 默认的数据库URL. */
public static final String DEFAULT_URL = "jdbc:hsqldb:mem:.";
/** * 默认的数据库用户. */
public static final String DEFAULT_USER = "sa";
/** * 驱动key. */
public static final String DRIVER = "connection.driver_class";
/** * 密码key. */
public static final String PASS = "connection.password";
/** * url key. */
public static final String URL = "connection.url";
/** * 用户名key. */
public static final String USER = "connection.username";
/** * xls路径key. */
public static final String XLSPATH = "xls.path";
/** * commons-configuration. */
private static PropertiesConfiguration config = new PropertiesConfiguration();
/** * logger. */
private static Log logger = LogFactory.getLog(DbunitHelper.class);
// fields
//
/** * 是否已经使用dbunit进行过初始化. */
private boolean alreadySetUp = false;
/** * 是否在每次测试之前都使用dbunit进行初始化. */
private boolean cleanInsertEachSetup = false;
/** * 密码. */
private String connectionPassword;
/** * URL. */
private String connectionUrl;
/** * 用户名. */
private String connectionUser;
/** * 驱动类名. */
private String driverClazz;
/** * xls路径. */
private String xlsPath;
/**
* 构造方法中使用默认的配置文件进行初始化.
*/
public DbunitHelper() {
doInit(DEFAULT_CONFIG_FILE);
}
/**
* 使用Properties进行初始化.
*
* @param properties 使用的Properties
*/
public void doInit(Properties properties) {
if ((properties == null) || properties.isEmpty()) {
return;
}
this.driverClazz = properties.getProperty(DRIVER);
this.connectionUrl = properties.getProperty(URL);
this.connectionUser = properties.getProperty(USER);
this.connectionPassword = properties.getProperty(PASS);
}
/**
* 进行初始化.
* 实际调用doInit(Properties properties)
*
* @param path 培植文件所在的路径
*/
public void doInit(String path) {
try {
config.load(path);
} catch (ConfigurationException e) {
logger.error("could not load the properties file : " + path, e);
}
Properties properties = new Properties();
properties.setProperty(DRIVER,
config.getString(DRIVER, DEFAULT_DRIVER));
properties.setProperty(URL, config.getString(URL, DEFAULT_URL));
properties.setProperty(USER, config.getString(USER, DEFAULT_USER));
properties.setProperty(PASS, config.getString(PASS, DEFAULT_PASS));
doInit(properties);
}
/**
* Close the specified connection.
* Ovverride this method of you want to keep your connection alive between tests.
*
* @param connection 关闭连接
* @throws Exception 关闭异常
*/
protected void closeConnection(IDatabaseConnection connection)
throws Exception {
connection.close();
}
/**
* 设定是否每次SetUp都清空数据.
*
* @param flag 是否每次测试之前都清空数据 true / false
*/
public void doCleanInsertEachSetup(boolean flag) {
this.cleanInsertEachSetup = flag;
}
/**
* 执行操作.
*
* @param operation 执行的操作
* @throws Exception 执行操作时发生的异常
*/
private void executeOperation(DatabaseOperation operation)
throws Exception {
if (operation != DatabaseOperation.NONE) {
IDatabaseConnection connection = getConnection();
try {
operation.execute(connection, getDataSet());
} finally {
closeConnection(connection);
}
}
}
/**
* Returns the test database connection.
*
* @return IDatabaseConnection 返回一个数据库连接
* @throws Exception 执行操作时发生的异常
*/
public IDatabaseConnection getConnection() throws Exception {
Class.forName(this.driverClazz);
Connection jdbcConnection = DriverManager.getConnection(this.connectionUrl,
this.connectionUser, this.connectionPassword);
return new DatabaseConnection(jdbcConnection);
}
/**
* Returns the test dataset.
* 从xls文件中生成DataSet并返回
*
* @return IDataSet dataSet
* @throws Exception 读取数据时可能发生的异常
*/
protected IDataSet getDataSet() throws Exception {
/*
* IDatabaseConnection con = getConnection();
* IDataSet dataset = con.createDataSet();
* XlsDataSet.write(dataset, new FileOutputStream("export.xls"));
*/
return new XlsDataSet(new FileInputStream(xlsPath));
}
/**
* 返回jdbc连接.
*
* @return Connection
* @throws Exception 连接错误
*/
public Connection getJdbcConnection() throws Exception {
return this.getConnection().getConnection();
}
/**
* Returns the database operation executed in test setup.
*
* @return DatabaseOperation 每次测试之前需要进行的操作
* CLEAN_INSERT清空,并重新插入xls的数据
* NONE什么也不做
* @throws Exception 执行初始化可能发生的错误
*/
protected DatabaseOperation getSetUpOperation() throws Exception {
if (!this.alreadySetUp) {
alreadySetUp = true;
preCleanAndInsert();
return DatabaseOperation.CLEAN_INSERT;
}
if (this.cleanInsertEachSetup) {
preCleanAndInsert();
return DatabaseOperation.CLEAN_INSERT;
}
return DatabaseOperation.NONE;
}
/**
* 这个是我自定义的方法,用来解决dbunit不能清空复杂关系数据的情况.
* 具体情况下需要自己重写这个方法
* FIXME: 我也许应该把这个方法写成abstract的?
*
* @throws Exception 执行初始化可能发生的错误
*/
protected void preCleanAndInsert() throws Exception {
Connection conn = null;
Statement state = null;
try {
conn = getJdbcConnection();
state = conn.createStatement();
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(
DbunitHelper.class.getClassLoader()
.getResourceAsStream("dbunit-clean.sql")));
String line = null;
while ((line = in.readLine()) != null) {
state.executeUpdate(line);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (in != null) {
in.close();
in = null;
}
}
//state.executeUpdate("delete from comment");
//state.executeUpdate("delete from article");
//state.executeUpdate("delete from category");
//state.executeUpdate("delete from role_menu");
//state.executeUpdate(
// "delete from menu where parent_id is not null");
//state.executeUpdate("delete from menu");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (state != null) {
state.close();
}
} finally {
if (conn != null) {
conn.close();
}
}
}
}
/**
* 设置xls文件的路径.
*
* @param path xls文件的路径
*/
public void setXlsPath(String path) {
xlsPath = path;
}
/**
* Returns the database operation executed in test cleanup.
*
* @return DatabaseOperation 获得测试结束后的操作,NONE什么也不做
* @throws Exception 应该不会发生错误
*/
protected DatabaseOperation getTearDownOperation()
throws Exception {
return DatabaseOperation.NONE;
}
/**
* 使用dbunit对数据库进行初始化.
*/
public void setUp() {
try {
executeOperation(getSetUpOperation());
} catch (Exception e) {
//throw new RuntimeException("error when doing dbunit setUp", e);
e.printStackTrace();
}
}
/**
* 执行测试结束时的操作.
*/
public void tearDown() {
try {
executeOperation(getTearDownOperation());
} catch (Exception e) {
throw new RuntimeException("error when doing dbunit tearDown",
e);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?