spring hibernate - 单元测试dao

时间:2013-04-16 07:53:04

标签: spring hibernate unit-testing

我正在尝试对我的DAO进行单元测试,但我遇到了一些麻烦。

首先,我的DAO有1个方法:findById类型方法。我想为此写一个单元测试。所以,我的思路是:

  • 为了测试此方法,我需要插入一个已知实体
  • 在DAO上致电findById()
  • 然后断言我得到的是我最初插入的内容。

现在,我正在努力解决的问题是试图弄清楚如何进行插入。

我的担忧:

  1. 我目前在DAO中没有insert方法。我可以写一个,但我不认为这样做只是为了测试。

  2. 另一种可能性是使用Hibernate API(即HibernateTemplate)来执行插入。但是,我希望我的单元测试具有灵活性。我不想将我的单元测试绑定到任何特定的API。

  3. 我该怎么办?

3 个答案:

答案 0 :(得分:2)

根据您的数据库(我更喜欢用于测试的内存中变体),您应该能够预先填充数据库并在每次单独测试之前将其设置为已知状态。因此,不需要insert方法来进行测试。我已经多次使用过HSQLDB(现在已经被另一个我不记得名字的数据库取代了),我经常创建数据库并运行一些插入SQL语句来在每次测试之前填充数据库。还有一些框架,如DbUnit

修改

我想到的数据库是H2。它似乎也有一个简洁的功能,它可以execute a script when a connection is made

String url = "jdbc:h2:mem;INIT=runscript from '~/create.sql'\\;runscript from '~/populate.sql'";

答案 1 :(得分:1)

通常我不会为我的DAO编写单元测试。我更喜欢通过集成/功能测试来测试这个区域。

如果您愿意,那么一个选项是预先填充数据库,以便您的单元测试用例知道对数据库的期望。

Spring提供了出色的DAO层测试框架,其中数据更改将被回滚,以便一次测试不会因数据更改而影响其他测试。

答案 2 :(得分:1)

配置集成测试的弹簧上下文时,可以尝试使用Spring's support for embedded databases<jdbc:script>标记允许您执行init和destroy脚本:

<jdbc:embedded-database type="H2" id="dataSource">
    <jdbc:script execution="INIT" location="setup.sql"/>
    <jdbc:script execution="DESTROY" location="teardown.sql"/>
</jdbc:embedded-database>