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

2022-09-03 02:45:57

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

我遇到的麻烦是DAO的持久性(对于非测试代码)是通过使用Spring/Hibernate的内部解决方案完成的,它消除了我发现的大多数示例都包含的常用模板。*.hbm.xml

因此,我在理解如何设置JUnit测试以实现DAO以创建/读取内存中的HSQLDB(只是非常基本的功能)时遇到了一些麻烦。我已经找到了一些示例,但是内部持久性的使用意味着我无法扩展示例显示的一些类(我似乎无法获得应用程序上下文.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>
    

答案 1

Spring 3提供了一个新的命名空间,其中包括对嵌入式数据库(包括HSQLDB)的支持。所以这照顾了这部分。jdbc

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

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

就实现测试而言,请使用Spring的TestContext框架。测试可以看起来像这样(我再次假设下面的Spring 3,尽管它应该在Spring 2.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 ...
    }
}

例如,您可以将嵌入式数据库放在 里面。(这里的'it'代表集成测试,文件在类路径上。本例中的控制器位于 中,并将自动连接到字段中。beans-datasource-it.xmlbeans-web.xmlContactController

这只是要做什么的概述,但希望它足以让你开始。


答案 2

请参阅此处。它假设maven2是构建工具,但你可以很容易地使用任何东西。


推荐