如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?

Posted

技术标签:

【中文标题】如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?【英文标题】:How to emulate Oracle (+) outer join notation in in-memory database used to run Java unit tests? 【发布时间】:2013-05-16 12:54:16 【问题描述】:

我们使用 HSQLDB 和 Oracle 数据库语法 (jdbc:hsqldb:mem:TestDB;sql.syntax_ora=true) 进行数据层单元测试。

(我们意识到这并不理想,如果我们可以针对实际的 Oracle 数据库进行测试会更好。但这不是一个选项,因为我们希望确保我们可以在任何地方运行我们的自动化测试。在后面的步骤中,所有查询也在实际 Oracle 数据库的集成测试中进行测试,该数据库的设置类似于生产数据库。)

有什么方法可以支持使用 HSQLDB 进行查询的 Oracle 外连接 (+) 表示法?

在我看来,我们不应该使用 (+) 表示法,而是使用标准的外连接表示法。但是,负责调整查询的人使用这种表示法,因此与他们的沟通会变得更加困难/容易出错。 虽然如果没有找到解决方案可能是一种选择,但这不是这里的问题。

我找到了以下线程: http://comments.gmane.org/gmane.comp.java.hsqldb.user/5756 使用那里提到的 QueryRewrite 补丁,我将有必要的钩子来自己处理 (+),但该接口从未进入官方 HSQL 版本。

对于 HSQL 是否有另一种解决方法?

我们可以在单元测试本身的某处添加查询重写(而不是在测试数据库级别),但如果我们能避免这种情况会更好。

如果没有 HSQL 的解决方法,是否有任何其他可从 jar 启动的内存数据库/数据库,支持这种 (+) 外连接表示法?

【问题讨论】:

【参考方案1】:

我认为您已经在问题中引用了所有“简单”的可能性。

因此,剩下的唯一方法是在将查询发送到 HSQLDB 之前在代码中重写查询。

将查询编写为不使用 (+) 符号,然后为您的数据库调谐器重写它们(使用脚本)应该更简单。这种重写应该比其他方向更容易,因为标准符号在其结构中包含更多信息。

【讨论】:

【参考方案2】:

不要使用它。有时,Oracle 优化器以不同的方式处理这两种语法。从 11g 开始,它已经结束了,没有理由坚持这种语法。

但无论如何,Oracle 有另一个 SQL 语法增强功能 - 例如分析查询。也许您应该使用 OracleXE 进行自动化测试。

【讨论】:

以上是关于如何在用于运行 Java 单元测试的内存数据库中模拟 Oracle (+) 外连接表示法?的主要内容,如果未能解决你的问题,请参考以下文章

用于单元测试的内存 DBMS

如何使用内存数据库中的 sqlite 在 laravel 5.5 中运行单元测试

用于单元测试的内存存储中的 iOS 10 核心数据

如何使用 H2 内存数据库编写单元测试

如何在 TestNG 单元测试类中分配类级别数据

junit是啥?