gpt4 book ai didi

java - 从 Oracle 实例创建内存数据库结构

转载 作者:IT老高 更新时间:2023-10-28 21:01:32 26 4
gpt4 key购买 nike

我有一个应用程序,其中许多 “单元” 测试在执行期间使用与 Oracle 数据库的真实连接。

您可以想象,执行这些测试需要花费太多时间,因为它们需要初始化一些 Spring 上下文,并与 Oracle 实例通信。除此之外,我们必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用 Spring 中的有用类,如 AbstractAnnotationAwareTransactionalTests)。

所以我的想法是用内存数据库逐步替换这个 Oracle 测试实例。我将使用 hsqldb或者更好h2 .

我的问题是知道什么是最好的方法。我主要关心的是内存数据库结构的构建和引用数据的插入。

当然,我可以从Oracle中提取数据库结构,使用SQL DeveloperTOAD等工具,然后修改这些脚本以适应hsqldbh2 语言。但我认为这不是更好的方法。


事实上,我已经在另一个项目中使用 hsqldb 做到了这一点,但是我已经手动编写了所有脚本来创建表。幸运的是,我只需要创建几张表。在这一步中,我的主要问题是将用于创建表的 Oracle 脚本“翻译”成 hsqldb 语言。

例如,使用以下 sql 命令在 Oracle 中创建的表:

CREATE TABLE FOOBAR (
SOME_ID NUMBER,
SOME_DATE DATE, -- Add primary key constraint
SOME_STATUS NUMBER,
SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);

需要将hsqldb“翻译”成:

CREATE TABLE FOOBAR (
SOME_ID NUMERIC,
SOME_DATE TIMESTAMP PRIMARY KEY,
SOME_STATUS NUMERIC,
SOME_FLAG INTEGER DEFAULT 0 NOT NULL);

在我当前的项目中,有太多表需要手动执行...


所以我的问题:

  • 您可以给我什么建议来实现这一目标?
  • h2hsqldb 是否提供一些工具来从 Oracle 连接生成脚本?

技术资料

Java 1.6、Spring 2.5、Oracle 10.g、Maven 2


编辑

关于我的单元测试的一些信息:

在我使用 hsqldb 的应用程序中,我进行了以下测试:- 一些与 DB 无关的“基本”单元测试。- 对于 DAO 测试,我使用 hsqldb 来执行数据库操作,例如 CRUD。- 然后,在服务层,我使用 Mockito 来模拟我的 DAO 对象,以便专注于服务测试而不是整个应用程序(即服务 + dao + DB)。

在我当前的应用程序中,我们遇到了最糟糕的情况:DAO 层测试需要运行 Oracle 连接。服务层使用(还)任何模拟对象来模拟 DAO。所以服务测试需要一个 Oracle 连接。

我知道模拟和内存数据库是两个不同的点,我会尽快解决它们。但是,我的第一步是尝试通过内存数据库删除 Oracle 连接,然后我将使用我的 Mockito 知识来增强测试。

请注意,我还想将单元测试与集成测试分开。后者需要访问 Oracle 数据库,才能执行“真正的”测试,但我主要担心(这也是这个问题的目的)是我现在几乎所有的单元测试都不是孤立运行的。

最佳答案

使用内存/Java 数据库进行测试。与您尝试在测试中“抽象”数据库相比,这将确保测试更接近真实世界。可能这样的测试也更容易编写和维护。另一方面,您可能确实想在测试中“抽象”出 UI,因为 UI 测试通常很难自动化。

您发布的 Oracle 语法适用于 H2 数据库(我刚刚测试过),因此 H2 似乎比 HSQLDB 更好地支持 Oracle 语法。免责声明:我是 H2 的作者之一。如果有问题,请将其发布到 H2 邮件列表中。

无论如何,您的版本控制系统中都应该有数据库的 DDL 语句。您也可以使用这些脚本进行测试。可能您还需要支持多个模式版本 - 在这种情况下,您可以编写版本更新脚本(更改表...)。使用 Java 数据库,您也可以对其进行测试。

顺便说一句,在使用 H2 或 HSQLDB 时,您不一定需要使用内存模式。即使您保留数据,这两个数据库也很快。而且它们很容易安装(只是一个 jar 文件)并且比 Oracle 需要更少的内存。

关于java - 从 Oracle 实例创建内存数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com