隨筆-112  評論-73  文章-0  trackbacks-0

          環境是這樣的:

          一個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 : ,

          posted on 2007-09-06 15:33 Libo 閱讀(756) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          常用鏈接

          留言簿(6)

          隨筆分類(54)

          隨筆檔案(109)

          其他BLOG

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 建瓯市| 霞浦县| 渑池县| 禄劝| 裕民县| 崇州市| 柳河县| 开封市| 龙陵县| 沧州市| 阿城市| 长春市| 沙洋县| 竹溪县| 沂源县| 鄱阳县| 嘉兴市| 肇源县| 论坛| 玉溪市| 卢氏县| 三河市| 甘谷县| 贺州市| 康平县| 布尔津县| 湘乡市| 贵南县| 吉安县| 城固县| 满洲里市| 石家庄市| 宜阳县| 荣昌县| 太原市| 饶阳县| 清水河县| 突泉县| 本溪市| 土默特左旗| 镇原县|