代码之家  ›  专栏  ›  技术社区  ›  Ryan P.

Spring/Hibernate/Junit针对hsqldb测试DAO的示例

  •  17
  • Ryan P.  · 技术社区  · 16 年前

    我正在努力实现 JUnit 测试以检查DAO的功能。(DAO将创建/读取基本的对象/表关系)。

    我遇到的问题是DAO的持久性(对于非测试代码)正在通过内部解决方案使用 春天/冬眠 消除了通常的 *.hbm.xml 我找到的大多数示例包含的模板。

    因此,我在理解如何设置 JUnit 测试实现DAO以创建/读取内存中的 HQLDB . 我发现了一些例子,但是内部持久性的使用意味着我无法扩展示例所显示的一些类(我似乎无法正确地获得application-context.xml设置)。

    是否有人建议我可以查看的任何项目/示例(或任何文档),以进一步了解实现此测试功能的最佳方法?我觉得这应该很简单,但在实现我发现的示例时,我一直遇到问题。

    编辑:

    以下是我的解决方案,可以帮助任何需要帮助的人更好地阅读:

    • 我的 TestClass :

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml")
      @Transactional
      public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
          @Resource(name = "sessionFactory")
          private SessionFactory exampleSessionFactory;
      
          @Resource(name = "exampleDao")
          private ExampleDao exampleDao;
      
    • 我的 applicationContext.xml 文件:

      <!-- List of Daos to be tested -->
      <bean id="exampleDao" class="org.myExample.ExampleDao"/>
      
      <!-- Datasource -->
      <bean id="example_dataSource"
            class="org.apache.commons.dbcp.BasicDataSource">
          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
          <property name="url" value="jdbc:hsqldb:mem:ExampleTest"/>
          <property name="username" value="sa"/>
          <property name="password" value=""/>
      </bean>
      
      <!-- Session Factory -->
      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
          <property name="dataSource" ref="example_dataSource"/>
          <property name="annotatedClasses">
              <list>
                  <value>org.myExample.ExampleClass</value>
              </list>
          </property>
          <property name="hibernateProperties">
              .... left to user to choose properties
          </property>
      </bean>
      
    5 回复  |  直到 9 年前
        1
  •  5
  •   Willie Wheeler    16 年前

    春天3提供了一个新的 jdbc 包含对嵌入式数据库(包括hsqldb)的支持的命名空间。所以这就解决了这个问题。

    我想知道“内部解决方案”是什么。您可以使用注释(JPA或Hibernate注释)来形成您的域对象,那么为什么您需要一个“内部解决方案”?例如。:

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
        p:dataSource-ref="dataSource"
        p:packagesToScan="myapp.model" />
    

    就实现测试而言,使用Spring的testcontext框架。一个测试可以是这样的(同样,我假设下面是Spring3,不过它应该在Spring2.5中工作,只需将@inject改为@autowired):

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({
        "/beans-datasource-it.xml",
        "/beans-dao.xml",
        "/beans-service.xml",
        "/beans-web.xml" })
    @Transactional
    public class ContactControllerIT {
        @Inject private ContactController controller;
    
        ... setUp() and tearDown() ...
    
        @Test
        public void testGetContact() {
            String viewName = controller.getContact(request, 1L, model);
    
            ... assertions ...
        }
    }
    

    你应该把嵌入式数据库放在里面 beans-datasource-it.xml 例如。(这里的“it”代表集成测试,文件在类路径上。)本例中的控制器位于 beans-web.xml 将自动连接到 ContactController 字段。

    这只是一个要做什么的大纲,但希望它足以让你开始。

        2
  •  2
  •   Bozho    16 年前

    See here . 它假定maven2作为构建工具,但您可以轻松地使用任何东西。

        3
  •  2
  •   AdrieanKhisbe aytigra    11 年前

    我最近在我的一些代码中使用 冬眠 , 春天 HQLDB。

    值得注意的是 AbstractTransactionalJUnit4SpringContextTests 现在已经被否决了-但它仍然是相当直接的测试-我在这里介绍了大部分细节: http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

        4
  •  1
  •   mdma    16 年前

    Hibernate的底线是 SessionFactory -您的内部解决方案很可能会以某种方式创建其中一个。找出方法,然后添加一个bean以同样的方式在测试应用程序上下文中创建一个bean(或者如果可能,使用运行时使用的内部代码)。您可能需要创建自己的 FactoryBean 进行实例化。(使用) AbstractFactoryBean 作为你的基础课。)

    一旦这一点到位,使用localsessionfactorybean的大多数示例都可以迁移到您的环境中,而不是使用localsessionfactorybean,而是使用定制的工厂bean。

    (如果你还没有这样做,看看 Testing Spring参考中的部分—它使用Spring进行测试,并轻而易举地使用上下文中的bean注入测试。)

        5
  •  0
  •   Derek Mahar    9 年前

    我的应用程序上下文看起来有点不同

    <beans:bean class="org.apache.commons.dbcp.BasicDataSource" id="HSQL_DS">
        <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <beans:property name="url" value="jdbc:hsqldb:mem:Test"/>
        <beans:property name="username" value="sa"/>
        <beans:property name="password" value=""/>
    </beans:bean>
    <jdbc:embedded-database id="HSQL_DS">
        <jdbc:script location="classpath:schema.sql"/>
        <jdbc:script location="classpath:data.sql"/>
    </jdbc:embedded-database>
    

    我的测试课是这样的:

    public class Tester {
    
        private EmbeddedDatabase db;
    
        @Before
         public void setUp(){
            db = new EmbeddedDatabaseBuilder().addDefaultScripts().build();
    
    
        }
    
        @Test
        public void TestMe(){
            System.out.println("Testing");
        }
    
    
        @After
        public void tearDown(){
    
            db.shutdown();
        }
    }