您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
對DAO編寫單元測試
作者:網絡轉載 發(fā)布時間:[ 2013/2/19 15:12:51 ] 推薦標簽:

  注意DatabaseFixture的createProxy()方法,它將一個普通的DAO對象包裝為在事務范圍內執(zhí)行的代理對象,即對于一個普通的DAO對象的方法調用前后,自動地開啟事務并根據(jù)異常情況提交或回滾事務。

  下面是UserDaoImpl的單元測試類:

 public class UserDaoImplTest extends DatabaseFixture {

  private UserDao userDao =  new UserDaoImpl();

  private UserDao proxy =  (UserDao)createProxy(userDao);
 @Test

  public void  testQueryUser() {

  User user =  newUser("test");

  proxy.createUser(user);

  User t =  proxy.queryUser("test");

  assertEquals(user.getEmail(), t.getEmail());

  }

  }
 

  注意到UserDaoImplTest持有兩個UserDao引用,userDao是普通的UserDaoImpl對象,而proxy則是將userDao進行了事務封裝的對象。

  由于UserDaoImplTest從DatabaseFixture繼承,因此,@Before方法在每個@Test方法調用前自動調用,這樣,每個@Test方法執(zhí)行前,數(shù)據(jù)庫都是一個經過初始化的“干凈”的表。

  對于普通的測試,如UserDao.queryUser()方法,直接調用proxy.queryUser()即可在事務內執(zhí)行查詢,獲得返回結果。

  對于異常測試,例如期待一個ResourceNotFoundException,不能直接調用proxy.queryUser()方法,否則,將得到一個UndeclaredThrowableException:

  對DAO編寫單元測試 圖-3

  這是因為通過反射調用拋出的異常被代理類包裝為UndeclaredThrowableException,因此,對于異常測試,只能使用原始的userDao對象配合TransactionCallback實現(xiàn):

 @Test(expected=ResourceNotFoundException.class)

  public void testQueryNonExistUser() throws Exception {

  new TransactionCallback()  {

  protected Object  doInTransaction() throws Exception {

  userDao.queryUser("nonexist");

  return null;

  }

  }.execute();

  }
 

  到此為止,對DAO組件的單元測試已經實現(xiàn)完畢。下一步,我們需要使用HibernateTool自動生成數(shù)據(jù)庫腳本,免去維護SQL語句的麻煩。相關的Ant腳本片段如下:

 <target name="make-schema" depends="build"  description="create schema">

  <taskdef  name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask">

  <classpath  refid="build-classpath"/>

  </taskdef>

  <taskdef  name="annotationconfiguration"  classname="org.hibernate.tool.ant.AnnotationConfigurationTask">

  <classpath  refid="build-classpath"/>

  </taskdef>

  <annotationconfiguration  configurationfile="$/hibernate.cfg.xml"/>

  <hibernatetool  destdir="$">

  <classpath  refid="build-classpath"/>

  <annotationconfiguration  configurationfile="$/hibernate.cfg.xml"/>

  <hbm2ddl

  export="false"

  drop="true"

  create="true"

  delimiter=";"

  outputfilename="schema.sql"

  destdir="$"

  />

  </hibernatetool>

  </target>
 

  完整的Ant腳本以及Hibernate配置文件請參考項目工程源代碼。

  利用HSQLDB,我們已經成功地簡化了對DAO組件進行單元測試。我發(fā)現(xiàn)這種方式能夠找出許多常見的bug:

    HQL語句的語法錯誤,包括SQL關鍵字和實體類屬性的錯誤拼寫,反復運行單元測試可以不斷地修復許多這類錯誤,而不需要等到通過Web頁面請求而調用DAO時才發(fā)現(xiàn)問題;
    傳入了不一致或者順序錯誤的HQL參數(shù)數(shù)組,導致Hibernate在運行期報錯;
    一些邏輯錯誤,包括不允許的null屬性(常常由于忘記設置實體類的屬性),更新實體時引發(fā)的數(shù)據(jù)邏輯狀態(tài)不一致。

  總之,單元測試需要根據(jù)被測試類的實際情況,編寫簡單有效的測試用例。本文旨在給出一種編寫DAO組件單元測試的有效方法。

上一頁1234下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd