1

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

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

  • 为了测试这个方法,我需要插入一个已知实体
  • 调用findById()DAO,
  • 然后断言我得到的是我最初插入的。

现在,我遇到困难的部分是试图弄清楚如何进行插入。

我的担忧:

  1. insert我目前在我的 DAO 中没有方法。我可以写一个,但我看不出仅仅为了测试而这样做的意义。

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

我应该怎么办?

4

3 回答 3

2

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

编辑

我想到的数据库是H2。似乎它还有一个简洁的功能,可以在建立连接时执行脚本

String url = "jdbc:h2:mem;INIT=runscript from '~/create.sql'\\;runscript from '~/populate.sql'";
于 2013-04-16T07:58:26.193 回答
1

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

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

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

于 2013-04-16T07:58:36.643 回答
1

在配置集成测试的 spring 上下文时,您可以尝试使用Spring 对嵌入式数据库的支持。<jdbc:script>标签允许您执行初始化和销毁​​脚本:

<jdbc:embedded-database type="H2" id="dataSource">
    <jdbc:script execution="INIT" location="setup.sql"/>
    <jdbc:script execution="DESTROY" location="teardown.sql"/>
</jdbc:embedded-database>
于 2013-04-16T08:01:31.627 回答