【问题标题】:JUnit tests using a mock database使用模拟数据库的 JUnit 测试
【发布时间】:2014-03-31 13:17:45
【问题描述】:

我正在开发一个测试不同 Web 服务的应用程序,我希望它尽可能通用。我需要填充数据库来进行 JUnit 测试,但我不希望提交这些更改。 我知道一些内存数据库(如 HSQL DB)允许在某种虚拟(或模拟)数据库上进行测试,但不幸的是,我使用的是 oracle,由于我的数据表结构复杂,我现在无法更改它。

您建议的最佳做法是什么? 谢谢。

【问题讨论】:

    标签: java database web-services junit


    【解决方案1】:

    首先,HSQL 和 Hibernate 没有任何关系。问题是您能否找到一个嵌入式数据库,它支持与您的生产数据库相同的 SQL(或者更确切地说是您的应用程序使用的 SQL 子集)。

    H2 database 是一个很好的候选者,因为它模拟了许多不同的 SQL 风格。

    最重要的是:不要测试数据库。假设您的供应商对数据库进行了彻底的测试并且可以正常工作。

    在我的代码中,我的目标是:

    1. 保存并加载每个实体。

    2. 为我使用的所有查询生成 SQL,并将它们与测试中的字符串文字进行比较(即我不会一直对数据库运行查询)。

    3. 某些测试会查找系统属性。如果已设置,那么他们将对数据库运行查询。这发生在我的 CI 服务器上的夜间。

    这样做的理由:只要数据库架构没有改变,实际运行查询就没有意义。这意味着在白天我坐在电脑前运行它们是一种巨大的时间浪费。

    为了确保“低影响”的更改不会漏掉,我让计算机在我不关心的时候运行它们。

    同样,我对许多返回各种预定义结果的 DAO 进行了模拟,因此我不必查询数据库。这里的基本原理是我想测试对数据库结果的处理,而不是 JDBC API、DB 驱动程序、操作系统的 TCP/IP 堆栈、网络硬件(和软件),或者我之间的 1000 件事情中的任何其他事情代码和数据库记录在某处的硬盘上。

    更多详情见我的博客:http://blog.pdark.de/2008/07/26/testing-with-databases/

    【讨论】:

    • 但是我认为在H2中导入我复杂的oracle数据库模式会很困难,没有其他选择吗?
    • 如果你想做这样的事情,无论哪种方式,都需要付出高昂的代价。要么您需要一种从单元测试创​​建 Oracle 实例的方法,要么您需要刷新数据库并加载它(这更容易一些),或者您需要遵循我的方法。
    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 2015-11-20
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多