【问题标题】:Testing Data Access Objects测试数据访问对象
【发布时间】:2016-11-07 06:15:41
【问题描述】:

在测试 DAO 时,我遵循以下规则:

  • 使用内存数据库
  • 为每次测试重置数据库数据

这适用于从数据库中进行选择。我使用选择所需的数据设置数据库,调用我的 DAO 并验证返回的对象是否具有正确的值。

但是在测试插入、更新和删除时,它变得很难看。我必须编写一个自定义选择语句来验证是否在我的数据库中插入/更新/删除了正确的数据。因此,当我完成编写测试时,我也可以再次测试我的测试。

网上有些人建议从字面上模拟所有内容,但这并不能真正测试 imo。

那么,如何测试 DAO?

【问题讨论】:

    标签: unit-testing dao data-access-object


    【解决方案1】:

    测试 DAO 包括 3 个不同的步骤。

    1) 测试 POJO(单元测试)

    2) 通过(集成测试)测试 DAO

    3) 测试 DAO 用户类。

    1) 测试 POJO:

    这个非常简单,与 DAO 测试无关。主要是为了增加项目的测试覆盖率,通常会测试普通对象的 setter 和 getter。

    2) 测试 DAO:

    这是一个集成测试,它不会增加单元测试的覆盖率。在这种情况下,必须创建并运行一个测试数据库。之后打开一个测试数据库会话并添加所有 daoMapper。完成此设置后,dao 类的所有方法都会被调用并一一测试。

    3) 测试 DAO 用户类:

    在单元测试实现中,模拟对象是一种非常有用的方法。当您正在测试一个类并且该类使用其他服务、方法和类时;您可以轻松地模拟这些服务、类和方法,因为它们可能已经在其他地方进行了测试。通过模拟,我们的意思是假设一个特定的方法返回一些特定的值或一个对象。

    有很多模拟工具,例如 EasyMock、PowerMockito 和 PowerMock。在 DAO mocking 的情况下(因为我们已经在上面测试过 DAO,我们可以模拟它们)我们可以使用 PowerMock 来模拟。

    【讨论】:

      【解决方案2】:

      您不必真的测试 DAO,只要它们足够苗条(应该如此)并且不包含业务逻辑。在为其他东西编写一些系统/集成测试时,您会在某个时候无意中测试它们。

      根据您使用的内容(ORM 框架?),您可能能够存根/模拟内容,但这并不值得。

      至于在 NUnit 中使用连接字符串(以便从您的测试项目中操作数据库),我认为一般来说没有任何问题,它比您想象的更常见。

      【讨论】:

      • 谢谢你的回答,但我没有完全明白最后一部分。什么是 NUnit 中的连接字符串,它与这个问题有什么关系?
      • 你说得对,我还没有说得那么清楚,因为我不知道你在测试什么语言/框架(C#/Java?)。您提到您正在为(之前/之后?)每个测试重置数据库数据 - 您可能通过直接从测试项目连接到数据库来做到这一点,这很好。
      • 我明白了。我实际上没有特定的语言/框架。我要求的是一种通用方法。
      猜你喜欢
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2020-05-02
      • 2017-01-01
      • 2020-06-12
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多