期待更好更稳定的开源FrameWork的出现,让我们一起努力吧!  
日历
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 78
  • 文章 - 1
  • 评论 - 29
  • 引用 - 0

导航

常用链接

留言簿(1)

随笔分类

随笔档案(42)

文章档案(37)

相册

搜索

  •  

积分与排名

  • 积分 - 44319
  • 排名 - 1068

最新随笔

最新评论

阅读排行榜

评论排行榜

 

查了半天的资料,终于搞清楚了如何在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 阅读(5041) 评论(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: 博客园 模板提供:沪江博客