環境是這樣的:
一個DAO接口 ,一個DAO的缺省實現類,這個實現了DAO接口的所有方法,并使用了泛型,所以其他的DAO實現類都省下了,不用寫了.因為所有的操作都在這個缺省實現類里面完成了.只需要在Spring 配置文件中配置一下就可以了。因為使用Hibernate,所以表之間的關系還是要測試的。測試也就離不開Spring環境了。還好Spring提供了好多測試類可以擴展,我使用的是AbstractTransactionalDataSourceSpringContextTests,據說它可以保持數據的清潔,操作完之后就回滾。跟據我的測試在沒有加flush()時候它好象根本就沒有插入到數據庫中,在加入flush()之后數據還是保留在數據庫中,沒有回滾(刪除)掉。測試的結果:
沒加入flush() :
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試部門[01] success :01
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試部門[01] success :01
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試[ 001 ] success :001
[2007-09-06 15:01:31] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試[ 001 ] success :001
保存成功 :001
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
[2007-09-06 15:01:31] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
按照這個提示應該是成功了。可是缺了插入和刪除的語句(因為我的Hibernate是showSql的),感覺并沒有真的向數據庫里寫入數據。感覺不放心!!!
加入flush() :
2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Began transaction (1): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@11f91ac]; default rollback = true
Hibernate: insert into Department (Manager, Name, Parent, Tel, Id) values (?, ?, ?, ?, ?)
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試部門[01] success :01
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試部門[01] success :01
Hibernate: insert into Users (Departmentid, Name, Password, Id) values (?, ?, ?, ?)
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試[ 001 ] success :001
[2007-09-06 15:03:44] cn.xiangyunsoft.business.dao.impl.DefaultAbstractDaoImpl : [DEBUG] - save 測試[ 001 ] success :001
保存成功 :001
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
[2007-09-06 15:03:44] cn.xiangyunsoft.sysadmin.dao.impl.UserDaoTest : [INFO ] - Rolled back transaction after test execution
這回出現在插入數據的語句了。但是操作完的數據還在數據庫里呆著呢!!!
為了保險起見,還要自己來清理垃圾吧!所以引入DBUnit
在原有的測試之前通過DBUnit準備數據,在測試之后清量數據。真是任勞任怨!
看一下代碼:這個是Dao的測試基本類,其他的測試都繼續這個就可以了。
package test.support;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
/**
* Dao 測試基礎類
*
* @author libo <br>
* @version 1.0 2007-9-6<br>
*/
public abstract class BaseDaoTest extends
AbstractTransactionalDataSourceSpringContextTests {
private ApplicationContext ctx;
private BasicDataSource dataSource;
private IDatabaseConnection connection;
public void execute(String path, DatabaseOperation oper) {
IDataSet dataset;
try {
dataset = new FlatXmlDataSet(new FileInputStream(path));
if (connection == null) {
if (dataSource == null)
dataSource = (BasicDataSource) getBean("dataSource");
if (dataSource != null) {
connection = new DatabaseConnection(this.dataSource
.getConnection());
// connection = new DatabaseConnection(this.dataSource
// .getConnection(), "schema");
} else
System.out.println("date source is null !!!!");
}
if (connection != null) {
// System.out.println("開始執行");
oper.execute(connection, dataset);
} else
System.out.println("connection is null!!!");
} catch (DataSetException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (DatabaseUnitException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
protected String[] getConfigLocations() {
return new String[] { "classpath:/applicationContext_test.xml",
"classpath:/beans.xml" };
}
public Object getBean(String beanName) {
if (ctx == null)
ctx = new FileSystemXmlApplicationContext(getConfigLocations());
return ctx.getBean(beanName);
}
}
來看一個具體的測試類:
public class UserDaoTest extends BaseDaoTest {
private String dataSet = "bin/cn/xiangyunsoft/sysadmin/dao/impl/user.xml";//DBUnit需用的文件的位置
private IDao<User> dao = (IDao<User>) getBean("userDao");
public void testSaveOrUpdate() {
execute(dataSet, DatabaseOperation.DELETE_ALL); //測試前準備測試數據環境
Department department =new Department();
department.setId("01");
department.setName("測試部門");
dao.save(department);
User dep = new User();
dep.setId("001");
dep.setName("測試");
dep.setDepartment(department);
Serializable s = dao.save(dep);
System.out.println("保存成功 :" + s);
assertNotNull(s);
execute(dataSet, DatabaseOperation.DELETE); //清除測試時的數據
}
現在來看測試的效果還是可以的。不知道以后遇到更復雜的表好不好用。
Technorati : dao, dbunit
posted on 2007-09-06 15:33
Libo 閱讀(756)
評論(0) 編輯 收藏