`
itwangxinli
  • 浏览: 146116 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring+hibernate dao和service层的单元测试

阅读更多

查了半天的资料,终于搞清楚了如何在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的接口哦。
呵呵,好了,祝你成功!

分享到:
评论

相关推荐

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    在项目中,如果没有 Service 层,而是在 Action 中直接操作 Dao 层的函数,这将导致代码结构不清晰、难以维护。因此,需要对 Action 进行单元测试,以确保代码的正确性和可靠性。 在搭建单元测试环境时,需要解决三...

    springmvc+spring+hibernate

    10. **测试与部署**:编写JUnit测试用例,对Controller、Service、DAO层进行单元测试。测试无误后,将项目打包成WAR文件,部署到Tomcat服务器上运行。 通过上述步骤,我们完成了Spring MVC、Spring、Hibernate的...

    用Maven搭建Spring+Spring MVC+Hibernate框架

    Controller负责接收请求,调用Service层的方法处理业务,Service层则调用DAO层(数据访问对象)进行数据操作,最后返回结果给Controller,由其决定如何呈现给用户。 总结起来,使用Maven在Eclipse中搭建Spring+...

    struts+spring+hibernate人力资源管理系统

    其次,Spring框架以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)闻名,它使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。Spring还提供了数据访问...

    JSF+Spring+Hibernate小例子

    在Java Web开发中,JSF(JavaServer Faces)、Spring和Hibernate是三个常用的技术栈,它们分别负责视图层、业务逻辑层和服务数据持久化层。这个"JSF+Spring+Hibernate小例子"为我们提供了一个整合这三者的基础应用,...

    Struts+Spring+Hibernate开发实例.pdf

    标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    struts+spring+hibernate(mysql)用户登录及文件上传

    Spring的ApplicationContext配置文件(如applicationContext.xml)用于配置服务层(Service)和数据访问层(DAO)的bean,实现事务管理和数据访问对象的创建。 接着,Hibernate作为ORM(对象关系映射)工具,负责将...

    jsf+spring+hibernate

    在本项目中,Spring 负责管理和协调整个应用的组件,如 Service 和 DAO。通过在 `web.xml` 中配置 `ContextLoaderServlet`,可以初始化 Spring 容器,并指定配置文件 `applicationContext.xml` 的位置。 3. **...

    maven(springmvc+spring+hibernate)

    6. **DAO和Service层**:实现数据访问对象(DAO)接口和业务服务(Service)接口,处理数据库操作和业务逻辑。 7. **Action和视图**:编写Struts Action类,实现用户请求的处理逻辑,返回相应的视图结果。 8. **测试...

    Spring+hibernate整合源代码

    可以使用 Spring 提供的 TestContext 框架,结合 JUnit 或 TestNG,对 Service 和 DAO 层进行测试。 10. **最佳实践**:在实际项目中,为了提高性能和可维护性,通常会采用 MyBatis 或 JPA 作为更轻量级的数据访问...

    现有Mysql数据库,写Spring + Hibernate的配置文件

    在本案例中,我们将探讨如何在已有的MySQL数据库环境下,配置Spring和Hibernate来实现数据访问层。 首先,我们需要在项目中引入Spring和Hibernate的相关依赖。在Maven或Gradle的构建文件中,添加对应的依赖库,如...

    ssh(struts+spring+hibernate)教务管理信息系统(全部代码) 可以直接运行

    1. **src**:源代码目录,包含Action类、Service类、DAO类和实体类。 2. **webapp**:Web应用目录,有WEB-INF子目录,里面包含web.xml、struts-config.xml等配置文件,以及JSP页面。 3. **lib**:原本应包含项目依赖...

    SSH(Struts+Spring+Hibernate)三层架构.

    3) **业务层的类包**:包含Service类,它们实现了业务逻辑,是表现层和持久层的桥梁,通常由Spring管理并注入所需的DAO和实体类。 **核心的配置文件**: - `struts-config.xml`:Struts的配置文件,定义了Action和...

    struts2+spring+hibernate Demo

    总之,Struts2+Spring+Hibernate的组合提供了强大的企业级应用开发能力,而这个Demo则展示了如何在MyEclipse 8.5环境下进行整合和配置,对于学习和理解SSH框架的集成具有很高的参考价值。通过熟练掌握这种技术栈,...

    spring+hibernate整合实现简单数据库添加记录

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在应用层和数据持久化层发挥着关键作用。Spring是一个全面的Java企业级应用开发框架,而Hibernate则是一个优秀的对象关系映射(ORM)工具,它简化了...

    spring+hibernate整合demo

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在应用层管理和持久化层处理数据。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及大量的集成...

    Webwork+spring+hibernate集成实例

    Webwork、Spring和Hibernate是Java开发中的三大框架,它们各自在不同的层面上为应用程序提供服务。Webwork负责处理用户交互,Spring提供依赖注入和管理事务,而Hibernate则专注于对象关系映射(ORM),使得数据库...

    Struts2 + Spring + Hibernate + DWR 项目布署笔记

    2. 在Spring的配置文件中定义Bean,包括DAO、Service和Action类,并进行必要的依赖注入。 3. 设置Hibernate的配置文件(hibernate.cfg.xml),包括数据库连接、实体映射等信息。 4. 创建并配置DWR的配置文件dwr.xml...

    struts+spring+hibernate开发 注册小实例

    4. **Spring配置**:编写spring-beans.xml文件,声明并配置Bean,包括Service层和DAO层。 5. **Hibernate配置**:配置hibernate.cfg.xml文件,设定数据库连接信息,创建实体类和对应的.hbm.xml映射文件。 6. **...

Global site tag (gtag.js) - Google Analytics