【问题标题】:Writing tests for DAOs为 DAO 编写测试
【发布时间】:2011-02-23 14:05:58
【问题描述】:

我目前被分配为一个项目编写测试,是否有必要为 DAO 类编写测试?

【问题讨论】:

    标签: java unit-testing testing


    【解决方案1】:

    这取决于:-)

    如果您的 DAO 类仅包含从数据库中获取实体所需的代码,则最好在单独的集成测试中对其进行测试*。要进行单元测试的代码是“业务逻辑”,您可以使用模拟 DAO 对其进行单元测试。

    [更新]使用EasyMock,您可以轻松地为特定类设置模拟(使用其类扩展,甚至可以模拟具体类),将其配置为从某个方法调用返回特定对象,并将其注入您的类中经过测试。

    EasyMock 网站现在似乎已关闭,希望它会很快恢复 - 然后您可以查看文档,恕我直言,该文档非常干净和彻底,其中包含大量代码示例。如果您的问题没有太多细节,我无法给出更具体的答案。 [/更新]

    OTOH,如果 DAO 还包含业务逻辑,那么您最好的选择(如果可以的话)是重构它们并将业务逻辑移出 DAO,然后您可以应用以前的策略。

    但最重要的是,始终牢记单元测试的座右铭“测试所有可能破坏的东西”。换句话说,我们需要优先考虑我们的任务,并将我们的精力集中在编写以最少的努力提供最大收益的测试上。首先为最关键、最容易出错的代码部分编写单元测试。在您看来,代码非常简单,无法破解,在列表的下方。当然,建议就具体代码向有经验的开发人员咨询 - 他们可能知道并注意到可能存在的陷阱和您不知道的问题。

    * 单元测试应该是轻量级、快速且尽可能与环境隔离的。因此,包括对真实数据库调用的测试不是单元测试,而是集成测试。尽管从技术上讲,它们可以使用 JUnit(例如 DbUnit)构建和执行,但它们比真正的单元测试要复杂得多,而且速度要慢几个数量级。有时这使得它们不适合在每次小的代码更改后执行,因为可以(并且通常应该)使用常规单元测试。

    【讨论】:

    • 你能给我一个快速的例子,如何从数据库中测试 getInstance,你有任何链接可以显示这个吗?我想到了嘲笑 DAO
    • 感谢您的详细解释,我使用 jMock 与 easyMock 类似
    【解决方案2】:

    是的,你应该为 DAO 编写单元测试。

    这些单元测试可以使用内存数据库。例如:HyperSQL

    关于如何使用 HyperSQL 在 Java 中编写持久性单元测试的文章:

    http://www.mikebosch.com/?p=8

    【讨论】:

    • 那将是一个功能或集成测试
    【解决方案3】:

    没有必要为任何事情编写测试。您是否从为您的 DAO 类编写测试中受益?大概吧。

    【讨论】:

    • 我当然受益 :D 你有什么链接可以让我学习吗? tnx
    【解决方案4】:

    是的。但是很少有人会争辩说,它不属于单元测试的范畴。因为它不符合每个说的单元测试的定义。我们称之为集成测试,我们测试代码与数据库的集成。

    此外,我在这里同意布鲁诺的想法。此外,还有一些 API 可用于执行此操作,其中一个是 DBUnit。

    【讨论】:

    • +1 是的,使用 DB 的测试按照定义是集成测试(它们测试 DAO 和 DB 之间的集成)。并且绝对使用 DBUnit(或类似的),我们使用它并证明它非常有用。
    【解决方案5】:

    是的。这样做有几个好处。一旦您确定您的 DAO 层工作正常,后期修复缺陷就变得容易了。

    【讨论】:

      【解决方案6】:

      我认为我们应该为 DAO 编写单元测试,而这样做的最大挑战之一是测试数据的设置和清理。这就是我认为的地方,例如 Spring JDBC 测试框架等框架可以通过让我们使用不同的注释控制事务来帮助我们[示例:@Rollback(true)]。

      例如,如果您正在测试“创建/插入”操作,Spring 允许您在测试方法执行后完全回滚事务,从而使数据库始终保持原始状态。

      您可以查看此链接了解更多信息:Spring Testing

      当您不希望一个测试破坏数据完整性而导致另一个测试失败的集成测试时,这会更加有用。

      【讨论】:

        【解决方案7】:

        xUnit 测试模式这本书为这个问题提供了很多很好的见解。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-09
          • 2017-07-24
          • 1970-01-01
          • 2020-10-20
          • 2021-09-29
          • 2013-01-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多