隨筆-55  評論-208  文章-0  trackbacks-0
          今天我將展示一下我是如何在實際中對dao進(jìn)行單元測試的
          首先我們來確認(rèn)一下dao需要什么樣的環(huán)境,我的dao是用Spring+hibernate來構(gòu)建的,而對應(yīng)的數(shù)據(jù)源是oracle9。所以要進(jìn)行dao的測試我需要從Spring的連接oracle的context中獲取dao的實例出來,這里我使用的是spring-mock
          spring-mock使用比較簡單的,只需要設(shè)置spring的配置文件路徑就可以獲得上下文了
          這里需要注意的是這個spring上下文是ClassPathApplicationContext,而我們在web環(huán)境中經(jīng)常遇到的是WebApplicationContext
          /**
           * $Id:$
           *
           * Copyright 2005 easou, Inc. All Rights Reserved.
           
          */

          package test.spring.common;

          import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;

          import test.PathConfig;

          public class BaseSpringTestCase extends
                  AbstractTransactionalDataSourceSpringContextTests 
          {    

              @Override
              
          protected String[] getConfigLocations() {

                  String[] config 
          = PathConfig.springxml;

                  
          return config;

              }
                  
              
          public void testConfig() {        
                  assertNotNull(
          "spring-mock context has bean init()",this.applicationContext);
              }


          }
          這里testConfig是用來檢查你spring配置的加載是否正確的

          下面給出一個DAO的簡單查詢方法
          public List getHomepageAreasByChannelId(long channelId) {

                  
          return this.executeHQL(" from CsHomepageArea  h where h.csChannel.id='"
                          
          + channelId + "' order by h.theOrder");
              }


          上面的方法指示根據(jù)一個id取列表出來,而我們要測試的目標(biāo)有(其實也就是我們這個方法要實現(xiàn)的目標(biāo)):
          1、給出正確的id是否能否返回正確的結(jié)果
          2、返回的結(jié)果集能夠根據(jù)hibernate配置文件而得到我們期望的結(jié)果集(比如說對子集的lazy讀?。?br /> 3、返回的結(jié)果集是否按照你所期望的排序
          4、給出錯誤的id是否在獲取數(shù)據(jù)時會出錯
          根據(jù)上面的測試目標(biāo)我們就很容易的得到下面的測試方法了

          public void testGetHomepageAreasByChannelId() {
                  List list 
          = channelDAO.getHomepageAreasByChannelId(1);
                  assertNotNull(
          "homepage list is not null", list);
                  CsHomepageArea homepage 
          = (CsHomepageArea) list.get(0);
                  assertNotNull(
          "homepage'name is not null", homepage.getName());
                  assertNotNull(
          "homepage'channel has been lazy", homepage.getCsChannel()
                          .getName());
                  assertNotNull(
          "homepage'column has been lazy", homepage.getCsColumn()
                          .getName());
                  assertNotNull(
          "homepage'subject has been lazy", homepage
                          .getCsSubjects().iterator().next().getName());
                  CsSubject subject 
          = (CsSubject) homepage.getCsSubjects().iterator()
                          .next();
                  assertNotNull(
          "homepage'subject'keyword has been lazy", subject
                          .getCsSubjectKeywords().iterator().next().getName());

              }

          對于DAO層的查詢方法,我們測試的就是判斷返回的數(shù)據(jù)是否是我們需要的

          下面這個方法是DAO的增改方法,和刪除方法

          public void saveComment(CsComment comment) {
                  getHibernateTemplate().saveOrUpdate(comment);        
              }

              
          public void deleteComment(CsComment comment) {        
                  getHibernateTemplate().delete(comment);        
              }

           

          對于這種無返回值得方法我們主要測試的是:
          1、對于正確的數(shù)據(jù)是否能夠正確的存入數(shù)據(jù)庫或者從數(shù)據(jù)庫刪除
          2、對于錯誤的數(shù)據(jù)操作能夠有錯誤信息(如主鍵重復(fù))

          public void testSaveComment(){
                  CsComment comment 
          = new CsComment();
                  comment.setCommentDate(
          new Date());
                  comment.setContent(
          "comment test");
                  channelDAO.saveComment(comment);
                  CsComment dbComment 
          =(CsComment)channelDAO.getEntity(comment.getId());
                  assertNotNull(
          "comment has bean saved", dbComment);
              }

              
          public void testDeleteComment(){
                  CsComment comment 
          = new CsComment();
                  comment.setId(
          new Long(13));
                  channelDAO.delete(comment);
                  CsComment dbComment 
          =(CsComment)channelDAO.getEntity(comment.getId());
                  assertNull(
          "comment has bean delete", dbComment);
              }

          其實這種save或者delete的方法由于使用時都是基本調(diào)用hibernate的方法,所以在我看來測試的意義并不是很大
          posted on 2007-01-17 00:59 rocket 閱讀(4127) 評論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 龙海市| 堆龙德庆县| 榆林市| 南木林县| 宾阳县| 西宁市| 疏附县| 东山县| 郧西县| 永福县| 偃师市| 翼城县| 阿尔山市| 本溪市| 介休市| 柳州市| 乌兰浩特市| 乌鲁木齐市| 德江县| 调兵山市| 三原县| 呼和浩特市| 浪卡子县| 卢湾区| 通城县| 富宁县| 屏边| 莆田市| 天台县| 明光市| 东明县| 定陶县| 临朐县| 岳西县| 厦门市| 建平县| 广河县| 秭归县| 阿巴嘎旗| 辛集市| 永德县|