期待更好更穩定的開源FrameWork的出現,讓我們一起努力吧!  
          日歷
          <2007年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567
          統計
          • 隨筆 - 78
          • 文章 - 1
          • 評論 - 29
          • 引用 - 0

          導航

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案(42)

          文章檔案(37)

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 45521
          • 排名 - 1064

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

           

          查了半天的資料,終于搞清楚了如何在hibernate+spring的框架下對DAO層和service層進行測試了。我把自己的經驗總結一下,希望對大家有所幫助。
          最重要的是applicationContext.xml的配置,
          dao的配置如下
           
          <bean id="CfmStorageRecordDAO"
            class="com.finegold.digimus.dao.imp.CfmStorageRecordDAOImp">
            <property name="sessionFactory">
             <ref bean="sessionFactory" />
            </property>
           </bean>

          如果是這樣的話,對于dao的測試,我想應該沒有什么問題;
          首先你的測試類應該繼承AbstractTransactionalSpringContextTests這個類,覆蓋他的一個方法;getConfigLocations

          如下所示
          public class ArticleDataDaoTest extends AbstractTransactionalSpringContextTests {
           protected String[] getConfigLocations() {
            return new String[] { "classpath:applicationContext.xml" };

           }

           CfmCatalogArticleDataDAO cfmCatalogArticleDataDAO;

           CfmCatalogMediaDAO media;

           public CfmCatalogMediaDAO getMedia() {
            return media;
           }

           public void setMedia(CfmCatalogMediaDAO media) {
            this.media = media;
           }
           public CfmCatalogArticleDataDAO getCfmCatalogArticleDataDAO() {
            return cfmCatalogArticleDataDAO;
           }

           public void setCfmCatalogArticleDataDAO(
             CfmCatalogArticleDataDAO cfmCatalogArticleDataDAO) {
            this.cfmCatalogArticleDataDAO = cfmCatalogArticleDataDAO;
           }

           public void testTreeView() {
            List list = cfmCatalogArticleDataDAO.getFormalListByCataTypeIdAndName(
              null, "01", -1, -1);
            assertTrue(list.size() != 0);
           }

          }
          然后直接運行就可以了,在這個過程中涉及到的所有事務都回RollBack.(),我覺得這個功能不錯。
          **********************************************************************************************
          對于service層的測試,由于我們在service層引用了Dao,而且service層配置了事務,呵呵,我的事務是聲明式的。首先看事務的定義:
              <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
                <property name="transactionManager">
                  <ref local="myTransactionManager"/>
                </property>
                <property name="transactionAttributes">
                  <props>
                    <prop key="create*">PROPAGATION_REQUIRED,-com.finegold.digimus.exception.DigimusException</prop>
                    <prop key="save*">PROPAGATION_REQUIRED,-com.finegold.digimus.exception.DigimusException</prop>
                    <prop key="remove*">PROPAGATION_REQUIRED,-com.finegold.digimus.exception.DigimusException</prop>
                    <prop key="update*">PROPAGATION_REQUIRED,-com.finegold.digimus.exception.DigimusException</prop>
                    <prop key="del*">PROPAGATION_REQUIRED,-com.finegold.digimus.exception.DigimusException</prop>
                    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
                  </props>
                </property>
              </bean>
          事務管理器的定義:
              <bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory">
                  <ref local="sessionFactory"/>
                </property>
              </bean>
          原來service層對事務的定義:
              <bean id="usersTarget" class="com.finegold.digimus.service.imp.UsersServiceImp">
                 <property name="usersDAO">
                    <ref local="SfmUsersDAO"/>
                 </property>
              </bean>
              <bean id="usersService" parent="txProxyTemplate">
                  <property name="target">
                     <ref local="usersTarget"/>
                  </property>
              </bean>
          問題就出在這里,如果是這樣定義的話,測試的時候一直出錯,錯誤如下,
          org.springframework.beans.factory.UnsatisfiedDependencyException:
          Error creating bean with name 'com.finegold.digimus.dao.imp.test.UserDaoTest':
          Unsatisfied dependency expressed through bean property 'userService':
           Set this property value or disable dependency checking for this bean.
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.checkDependencies(AbstractAutowireCapableBeanFactory.java:995)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:856)
           at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:227)
           at org.springframework.test.AbstractDependencyInjectionSpringContextTests.setUp(AbstractDependencyInjectionSpringContextTests.java:201)
           at junit.framework.TestCase.runBare(TestCase.java:125)
           at junit.framework.TestResult$1.protect(TestResult.java:106)
           at junit.framework.TestResult.runProtected(TestResult.java:124)
           at junit.framework.TestResult.run(TestResult.java:109)
           at junit.framework.TestCase.run(TestCase.java:118)
           at junit.framework.TestSuite.runTest(TestSuite.java:208)
           at junit.framework.TestSuite.run(TestSuite.java:203)
           at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
           at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
           at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
          解決辦法:將service層的bean定義改寫為如下的方式:
              <bean id="usersService" parent="txProxyTemplate">
                  <property name="target">
                        <bean class="com.finegold.digimus.service.imp.UsersServiceImp">
                 <property name="usersDAO"> <ref local="SfmUsersDAO"/></property>
                  </bean>
                  </property>
              </bean>
          ,然后就可以向dao一樣,寫service層的測試了,不過你要把相應的dao接口改為service的接口哦。
          呵呵,好了,祝你成功!

          posted on 2007-06-22 17:43 BlueSky_itwangxinli 閱讀(5073) 評論(2)  編輯  收藏
          評論:
          • # re: Spring+hibernate dao和service層的單元測試  yupeng-raul7 Posted @ 2008-10-17 11:36
            樓主能不能發一份代碼給我啊,
            我現在正在做這個,碰到麻煩了,謝謝!!
            我的郵箱:yupeng_raul7@hotmail.com
            謝謝!!!  回復  更多評論   

          • # re: Spring+hibernate dao和service層的單元測試[未登錄]  阿飛 Posted @ 2011-07-17 15:41
            LZ,你好,我也遇到了這個問題,不知道時隔這么多年,你是否還能幫我解決,我的Service層的bean設置跟你下面正確的配置是一樣的,但是還是報上述錯誤,Unsatisfied dependency expressed through bean property transactionManager,我的qq:857622848,期待您的幫助~  回復  更多評論   


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


          網站導航:
           
           
          Copyright © BlueSky_itwangxinli Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 大厂| 习水县| 若尔盖县| 板桥市| 临西县| 莱芜市| 黑山县| 即墨市| 长汀县| 惠州市| 英吉沙县| 盖州市| 门源| 裕民县| 若尔盖县| 甘孜县| 商丘市| 昌图县| 佛坪县| 隆昌县| 临江市| 遵化市| 东阿县| 平定县| 汉阴县| 淄博市| 普兰县| 全南县| 洛南县| 余江县| 罗定市| 武定县| 玛纳斯县| 明光市| 永州市| 巴东县| 康定县| 巫溪县| 广汉市| 仙桃市| 上饶市|