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

标签 java hibernate spring junit hsqldb

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

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

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

最佳答案

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

我想知道“内部解决方案”可能是什么。您可以使用注释(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,尽管只需将 @Inject 更改为 @Autowired 它应该在 Spring 2.5 中工作):

@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”代表集成测试,文件位于类路径中。)本例中的 Controller 位于 beans-web.xml 中,并将 Autowiring 到 ContactController 字段。

这只是一个概述,但希望它足以让你开始。

关于java - 针对 HSQLDB 测试 DAO 的 Spring/Hibernate/Junit 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861796/

相关文章:

java - HIbernate 多对一连接条件查询

java - Hibernate 中的延迟加载和集合

java - 如何在 Spring MVC 中处理 RESTful 删除

java - spring 在 namedParameterJdbcTemplate 中动态选择列名

java - Java Web 应用程序的推送通知

java - 在 Jboss AS 6 中更新 Mojarra

Java:LDAP 搜索返回 1 行

java - 添加 lucene 时 hibernate 配置文件出现错误

java - 部署到 war 的 Spring Boot 不发送谷歌电子邮件

java - hibernate 和 Spring : EntityManager is Null