【问题标题】:Should I use DAOs from production code to setup & verify tests?我应该使用生产代码中的数据来设置和验证测试吗?
【发布时间】:2019-07-14 13:56:53
【问题描述】:

我目前正在开发一个项目,该项目由多个存储库组成,所有存储库都依赖于存储用于数据库操作的代码的存储库:

  • AWS lambda1 的 repo1 具有 databaseRepo 作为依赖项
  • repo2 for AWS lambda2 具有 databaseRepo 作为依赖项
  • AWS lambda3 的 repo3 具有 databaseRepo 作为依赖项
  • ...
  • databaseRepo - 用于数据库操作的 SQL 脚本、存储库和 DAO(带有普通 JDBC)。

我们在生产环境和内存 H2 中有 MySQL 用于测试目的。让我们假设我想在其中一个存储库(例如 repo1)中测试逻辑,该存储库需要数据库中的一些记录才能返回成功。我们需要在测试执行之前插入一行,并且我们还断言在测试结束时是否正确修改了其他行。对于测试设置和验证,哪种方法更好/更干净?

  1. 使用 databaseRepo(生产代码)中的存储库/DAO 在测试中执行 CRUD 操作。
  2. 为 DAO/存储库层创建 test 代码并仅在测试代码中使用它。

目前我们正在使用第二种方法,恕我直言,在我们的情况下更好,因为我们没有经过良好测试的 databaseRepo 逻辑。但是,这样我们有一点代码重复,我们需要维护更多的代码。

您使用哪种方法以及为什么?

问候, 迈克尔

【问题讨论】:

    标签: java database testing tdd clean-architecture


    【解决方案1】:

    切希奇·米哈乌! :) 如果我理解正确,我也会选择第二种选择。您正在测试对存储库数据具有外部依赖性的代码/模块。因此,您可以将此依赖抽象为一个接口并创建两个实现:一个用于生产,一个用于测试。在我看来,这是干净的,尽管它有一些代码重复。

    您可以做的其他事情是甚至使用模拟来以声明方式告诉您希望什么值来驱动您的测试。

    希望这会有所帮助。 :)

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2011-12-21
      • 2017-08-31
      相关资源
      最近更新 更多