【问题标题】:How to unit test DAOs without ORM如何在没有 ORM 的情况下对 DAO 进行单元测试
【发布时间】:2018-03-03 16:43:14
【问题描述】:

我现在正在编写一个 JAX-RS Web 服务。我的数据库逻辑被划分为 DAO 接口(例如interface ItemDAO 和具体实现class JDBCItemDAO),它们通过依赖注入注入到我的控制器中。现在,通过给他们模拟 DAO 来对我的控制器进行单元测试相对简单。但是,我无法真正测试我的 DAO,因为它们使用 JDBC API,并且除了 ConnectionFactory(将 java.sql.Connection 返回给调用者)之外没有任何依赖项。我真的不能只将模拟连接传递给 DAO,因为仅验证 DAO 中的 SQL 查询是不够的。我希望能够测试它在数据库中是否有效。我怎样才能做到这一点?

【问题讨论】:

  • 与您测试使用 ORM 的 DAO 的方式相同(您还想测试查询是否在数据库上实际工作):您使用已知的测试数据填充测试数据库,然后调用您的DAO 方法,然后检查它们是否返回或更新预期数据。存在使第一步更容易的工具:DbSetup(无耻插件)、DBUnit,可能还有其他工具。
  • 针对真实数据库的测试通常称为集成测试,因为它们不再测试单个代码单元。
  • @MickMnemonic 但是我基本上只是在测试我的 DAO 对象,而不是任何其他代码

标签: java unit-testing jdbc junit mocking


【解决方案1】:
  1. 设置数据库。如果您编写标准 SQL 而不依赖于特定于数据库的功能,则可以使用内存数据库,例如 H2
  2. 设置DataSource 对象指向您的数据库。这比你现在在 DAO 中的ConnectionFactory 更可取。您不想一直建立新的物理连接,因为这很昂贵。
  3. 在生产代码中使用池化的DataSource,例如HikariCP 并且可能在您的测试代码中使用更简单的东西,例如SingleConnectionDataSource

【讨论】:

猜你喜欢
  • 2014-07-29
  • 2022-10-19
  • 2023-01-09
  • 2020-10-23
  • 1970-01-01
  • 2012-05-14
  • 2010-11-05
  • 2022-07-07
  • 2012-03-19
相关资源
最近更新 更多