Java 从Oracle实例创建内存中的数据库结构
我有一个应用程序,其中许多“单元”测试在执行期间使用到Oracle数据库的真实连接 可以想象,这些测试需要花费太多的时间来执行,因为它们需要初始化一些Spring上下文,并与Oracle实例通信。除此之外,我们还必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用Spring中的有用类,比如Java 从Oracle实例创建内存中的数据库结构,java,unit-testing,hsqldb,h2,in-memory-database,Java,Unit Testing,Hsqldb,H2,In Memory Database,我有一个应用程序,其中许多“单元”测试在执行期间使用到Oracle数据库的真实连接 可以想象,这些测试需要花费太多的时间来执行,因为它们需要初始化一些Spring上下文,并与Oracle实例通信。除此之外,我们还必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用Spring中的有用类,比如AbstractAnnotationAwareTransactionalTests) 所以我的想法是用内存中的数据库逐步替换这个Oracle测试实例。我会用,或者更好 我的问题是要知道做这
AbstractAnnotationAwareTransactionalTests
)
所以我的想法是用内存中的数据库逐步替换这个Oracle测试实例。我会用,或者更好
我的问题是要知道做这件事的最佳方法是什么。我主要关心的是内存数据库结构的构建和参考数据的插入
当然,我可以使用诸如sqldeveloper
或TOAD
之类的工具从Oracle中提取数据库结构,然后修改这些脚本以使其适应hsqldb
或h2
语言。但我不认为这是更好的方法
事实上,我已经在另一个项目中使用了
hsqldb
,但是我已经手动编写了创建表的所有脚本。幸运的是,我只需要创建几个表。在此步骤中,我的主要问题是将用于创建表的Oracle脚本“翻译”为hsqldb
语言
例如,在Oracle中使用以下sql命令创建的表:
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);
在我当前的项目中,有太多的表无法手动执行此操作
所以我的问题是:
- 为了实现这一目标,你能给我什么建议
或h2
是否提供了一些工具来从Oracle连接生成脚本hsqldb
技术资料 Java1.6、Spring2.5、Oracle10.g、Maven 2
编辑 有关我的单元测试的一些信息: 在我使用
hsqldb
的应用程序中,我进行了以下测试:
-一些与DB无关的“基本”单元测试。
-对于DAO测试,我使用hsqldb
执行数据库操作,例如CRUD。
-然后,在服务层,我使用Mockito
来模拟我的DAO对象,以便专注于服务测试,而不是整个应用程序(即service+DAO+DB)
在我当前的应用程序中,我们遇到了最糟糕的情况:DAO层测试需要运行Oracle连接。服务层不使用任何模拟对象来模拟DAO。因此,服务测试也需要Oracle连接
我知道mock和内存数据库是两个独立的点,我将尽快解决它们。但是,我的第一步是尝试通过内存数据库删除Oracle连接,然后我将使用我的Mockito
知识来增强测试
注意,我还想将单元测试与集成测试分开。后者需要访问Oracle数据库,才能执行“真正的”测试,但我主要关心的是(这就是这个问题的目的)我现在几乎所有的单元测试都不是孤立运行的。您的单元测试是为了什么? 如果他们测试DDL和存储过程是否正常工作,那么您应该编写与Oracle“更接近”的测试:要么不使用Java代码,要么根本不使用Spring和其他优秀的web界面,重点放在db上 如果您想测试用Java和Spring实现的应用程序逻辑,那么您可以使用模拟对象/数据库连接使您的测试独立于数据库
如果您想整体测试工作(这与模块化开发和测试原则背道而驰),那么您可以虚拟化您的数据库并在该实例上进行测试,而不必冒进行一些不可逆的修改的风险。使用内存中/Java数据库进行测试。这将确保测试比试图在测试中“抽象”数据库更接近真实世界。可能这样的测试也更容易编写和维护。另一方面,您可能希望在测试中“抽象”的是UI,因为UI测试通常很难自动化 您发布的Oracle语法与H2数据库配合得很好(我刚刚测试过),因此H2似乎比HSQLDB更好地支持Oracle语法。免责声明:我是H2的作者之一。如果有些东西不起作用,请把它贴在H2邮件列表上 无论如何,您应该在版本控制系统中拥有数据库的DDL语句。您也可以使用这些脚本进行测试。您可能还需要支持多个模式版本——在这种情况下,您可以编写版本更新脚本(ALTERTABLE…)。使用Java数据库,您也可以测试这些
顺便说一下,在使用H2或HSQLDB时,不一定需要使用内存模式。即使您持久化数据,这两个数据库的速度都很快。而且它们易于安装(只需一个jar文件),所需的内存比Oracle少得多。最新的HSQLDB 2.0.1通过语法兼容标志sql.syntax_ora=true支持DUAL、ROWNUM、NEXTVAL和CURRVAL的Oracle语法。以同样的方式,字符串与空字符串的串联以及唯一约束中对空的限制也使用其他标志处理。大多数ORACLE功能(如TO_CHAR、TO_DATE、NVL等)都已内置 目前,要使用简单的ORACLE类型(如NUMBER),可以使用类型定义: 将类型编号创建为数字 设置标志后,下一个快照将允许数量(N)和ORACLE类型兼容性的其他方面 下载自 [更新:]10月4日发布的快照将大多数Oracle特定类型转换为ANSI SQL类型。