環(huán)境是這樣的:
一個DAO接口 ,一個DAO的缺省實(shí)現(xiàn)類,這個實(shí)現(xiàn)了DAO接口的所有方法,并使用了泛型,所以其他的DAO實(shí)現(xiàn)類都省下了,不用寫了.因?yàn)樗械牟僮鞫荚谶@個缺省實(shí)現(xiàn)類里面完成了.只需要在Spring 配置文件中配置一下就可以了。因?yàn)槭褂肏ibernate,所以表之間的關(guān)系還是要測試的。測試也就離不開Spring環(huán)境了。還好Spring提供了好多測試類可以擴(kuò)展,我使用的是AbstractTransactionalDataSourceSpringContextTests,據(jù)說它可以保持?jǐn)?shù)據(jù)的清潔,操作完之后就回滾。跟據(jù)我的測試在沒有加flush()時(shí)候它好象根本就沒有插入到數(shù)據(jù)庫中,在加入flush()之后數(shù)據(jù)還是保留在數(shù)據(jù)庫中,沒有回滾(刪除)掉。測試的結(jié)果:
沒加入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
按照這個提示應(yīng)該是成功了。可是缺了插入和刪除的語句(因?yàn)槲业腍ibernate是showSql的),感覺并沒有真的向數(shù)據(jù)庫里寫入數(shù)據(jù)。感覺不放心!!!
加入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
這回出現(xiàn)在插入數(shù)據(jù)的語句了。但是操作完的數(shù)據(jù)還在數(shù)據(jù)庫里呆著呢!!!
為了保險(xiǎn)起見,還要自己來清理垃圾吧!所以引入DBUnit
在原有的測試之前通過DBUnit準(zhǔn)備數(shù)據(jù),在測試之后清量數(shù)據(jù)。真是任勞任怨!
看一下代碼:這個是Dao的測試基本類,其他的測試都繼續(xù)這個就可以了。
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 測試基礎(chǔ)類
*
* @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("開始執(zhí)行");
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); //測試前準(zhǔn)備測試數(shù)據(jù)環(huán)境
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); //清除測試時(shí)的數(shù)據(jù)
}
現(xiàn)在來看測試的效果還是可以的。不知道以后遇到更復(fù)雜的表好不好用。
Technorati : dao, dbunit
posted on 2007-09-06 15:33
Libo 閱讀(759)
評論(0) 編輯 收藏