【问题标题】:Testing methods which query database with JUnit使用 JUnit 查询数据库的测试方法
【发布时间】:2012-07-16 16:58:03
【问题描述】:

我应该如何对它们的意图是查询数据库并返回一些数据的方法进行单元测试?对于其他情况,我可以只模拟对象,但在这种情况下,我想测试它们是否返回正确的数据,我应该如何检查它与数据库的隔离?我应该使用某种特殊的数据库吗?但是,我应该如何配置该新数据库,使其与其他数据库一样使用所有这些列等?

谢谢。

更新:感谢大家,他们的回答使我走上了正确的道路。我终于用了debry。我刚刚为此添加了一个新的 persistence.xml。没有其他重大变化,现在似乎可以正常工作了。

【问题讨论】:

  • 您具体要测试什么?如果您正在使用数据库进行集成测试,您可以针对真实数据库运行,使用内存中的数据库等。无论哪种方式,是的,如果有数据库,您需要确认实际架构的数据,至少在您的测试对其进行操作的范围内。
  • 谢谢,例如,如果我想测试 debry。在我正在测试的类的方法中,我有 persist(model) 命令。那么在不改变类代码的情况下,我可以只配置环境使用debry而不是mysql吗?

标签: java unit-testing testing mocking


【解决方案1】:

我成功使用的一种方法是使用:

  1. Maven 构建您的项目
  2. Liquibase(或 Flyway)来管理您的数据库架构,并对其进行版本控制
  3. H2 作为与您的测试一起启动的内存数据库。

如果您没有使用上述任何方法,那么在那里学习很多东西,但根据我的经验,这是非常值得的。这对 Spring 应用程序非常有效;使用其他设置,您的里程可能会有所不同。

Maven 应该在进行任何测试之前在内存中启动一个 H2 数据库实例。在 Spring 应用程序中,您只需使用 H2 JDBC URL 指定数据源,它就会自动启动。

您可以使用 Liquibase 运行一组 XML 脚本来设置您的数据库架构,然后使用一个单独的文件来填充测试数据(通过在运行 Liquibase 时指定不同的文件,或者通过使用 context 属性每个changeSet)。这可以使用 Maven 来完成,或者在 Spring 中使用特定的 Liquibase bean 来完成。

您可以从那里完全测试您的应用程序,就像它是一个普通应用程序一样。不需要嘲笑,结果你会得到更多有用的测试。您可能需要更改架构或以其他方式解决 H2 与本地 RDBMS 之间的 SQL 差异。

顺便说一句,我非常赞成这类测试。根据我的经验,模拟一切并不能真正让您获得任何有趣的见解,并且应该是无法进行内部构建集成测试时的最后手段。不过有很多人不同意我的观点!

【讨论】:

    【解决方案2】:

    问题是您需要对什么行为进行单元测试?如果您模拟了数据库,那么您已经测试了所有重要的逻辑。您的数据库适配器将工作或不工作,您可以在针对真实数据库的集成/验收测试中进行验证。

    【讨论】:

    • 我的班级很大。它的工作原理是这样的:它有几个方法,例如,getAssets() 在这个方法中它创建一个 Hibernate 标准,然后基于它从 Asset 表中返回资产。所以我想测试这个方法。如果我使用模拟对象并告诉它要返回什么,那么我实际上还没有测试过这个类的功能。我有吗?
    • 或者我对 mocking 不太了解!
    • 理想情况下,您对外部资源的所有访问都由瘦(最小逻辑)适配器类提供。您可以通过查看它们包含的方法是否被正确调用来模拟这些类来进行单元测试。适配器本身很愚蠢,不需要进行大量的单元测试。现在,它在实践中并不总是能很好地工作,如果您发布一些您需要进行单元测试的代码,也许我们可以为您提供更好的帮助。
    • 感谢您的宝贵时间,我已经模拟了模型(实​​体)对象。问题是我的一个类不使用该数据模型层对象并使用 Hibernate 标准显式查询数据库。我将在今天晚些时候发布更多详细信息。谢谢。
    【解决方案3】:

    您可以使用DBUnit。它采用您当前的架构,您可以轻松地模拟您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多