Spring / Hibernate / Junit测试DAO对HSQLDB的例子

时间:2010-05-18 23:09:06

标签: java hibernate spring junit hsqldb

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

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

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

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

修改

这是我的解决方案,为了更好的可读性,对于任何需要伸出援助之手的人来说:

  • 我的*.hbm.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

5 个答案:

答案 0 :(得分:5)

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

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

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

就实现测试而言,使用Spring的TestContext Framework。测试可以看起来像这样(我再次假设下面是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中。 ('它'代表集成测试,文件在类路径上。)此示例中的控制器位于beans-web.xml,并将自动装入ContactController字段。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我最近使用 Hibernate Spring HSQLDB在我的一些代码中实现了类似的解决方案。

值得注意的是AbstractTransactionalJUnit4SpringContextTests现在已经被弃用了 - 但它仍然很容易测试 - 我在这里详细介绍了大部分细节:http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

答案 3 :(得分:1)

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

一旦这样,使用LocalSessionFactoryBean的大多数示例都可以迁移到您的情况 - 而不是使用LocalsessionFactoryBean,请使用您的自定义工厂bean。

(如果你还没有这样做,请查看spring参考中的Testing部分 - 它使用Spring进行测试,并从上下文中轻松地使用bean注入测试。)

答案 4 :(得分:0)

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

<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();
    }
}