【问题标题】:spring hibernate - unit testing daospring hibernate - 单元测试 dao
【发布时间】:2013-04-16 07:53:04
【问题描述】:

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

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

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

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

我的担忧:

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

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

我该怎么办?

【问题讨论】:

  • 快速谷歌一下 Mockito - 这是一个可以让您模拟结果的测试框架。它不能完全回答您的问题,但绝对是一个开始寻找的地方。

标签: spring hibernate unit-testing


【解决方案1】:

根据您的数据库(我更喜欢用于测试的内存变体),您应该能够在每次单独测试之前预先填充数据库并将其设置为已知状态。所以不需要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'";

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您可以在配置集成测试的 spring 上下文时尝试使用Spring's support for embedded databases<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>
      

      【讨论】:

      • 谢谢,我使用了嵌入式数据库,它似乎工作得很好。不过,我在启动时遇到了问题。我正在使用hibernate,所以我的数据库模式在我的映射文件中,这意味着我不应该编写一堆 CREATE TABLE 语句。但是,如果我运行我的单元测试,我会得到一个异常,说 XXX 表不存在。似乎正在发生的是它在创建模式之前运行我的插入语句。我该如何解决?再次感谢!
      • 我认为这个问题的每个解决方案都会有一些代价。在这种情况下,代价是您需要维护模式创建脚本,但还不错: 1) Hibernate 在使用hibernate.hbm2ddl.auto=create-drophibernate.show_sql=true 时基本输出脚本; 2)我认为你可以在上面的xml配置中有多个init &lt;script&gt;标签,所以你可以将hibernate的输出转储到本地化的schema.sql脚本中; 3)一旦你的架构稳定了,就不需要经常接触这个文件了。
      • 像 DBUnit 这样的其他解决方案需要相当多的工作量(甚至更多),所以这基本上取决于你个人的喜好,但无论如何都会有一些不便,我害怕。
      猜你喜欢
      • 2012-12-22
      • 2015-07-09
      • 2018-02-11
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多