Database 具有oracle语法的H2嵌入式数据库?

Database 具有oracle语法的H2嵌入式数据库?,database,spring,oracle,Database,Spring,Oracle,我已经在连接器字符串和init脚本set Mode Oracle中将H2数据源设置为Oracle模式 然而,许多功能无法执行;例如日期trunc函数,这在我们的代码中非常常见 测试我的数据库应用程序的实用方法是什么?看起来我可能必须回到我的全面QA/Dev测试oracle实例。事实上,对于任何人来说,实现Oracle的语法副本都将是一项艰巨的任务,因此我可以想象,任何用于测试的轻量级内存dbs都将错过Oracle的许多功能 您通常如何处理这个问题?在我看来,应该区分单元测试和集成测试。单元测试不

我已经在连接器字符串和init脚本
set Mode Oracle中将H2数据源设置为Oracle模式

然而,许多功能无法执行;例如日期
trunc
函数,这在我们的代码中非常常见

测试我的数据库应用程序的实用方法是什么?看起来我可能必须回到我的全面QA/Dev测试oracle实例。事实上,对于任何人来说,实现Oracle的语法副本都将是一项艰巨的任务,因此我可以想象,任何用于测试的轻量级内存dbs都将错过Oracle的许多功能


您通常如何处理这个问题?

在我看来,应该区分单元测试和集成测试。单元测试不应该有任何外部依赖,您应该模拟DAO类(例如:使用Mockito)。针对真实数据库的测试应该在集成测试期间完成

正如您可能已经看到的,在单元测试期间使用嵌入式数据库的问题是,语法可能与生产数据库不同

缓解这一问题的一种方法是设置一个集成测试环境(例如:使用Bambol CI工具),在该环境中,您可以使用专用的生产(如Oracle)数据库进行测试。使用嵌入式数据库进行尽可能多的测试,但对于那些以后无法在集成环境中进行测试的测试


这个集成测试环境将位于开发团队成员共享的自己的服务器上。诸如Bambol之类的工具可以在新提交时自动检测,并启动集成测试

我只是发现了一些问题(例如不同的语法)。至少HSQLDB允许您配置“语法模式”。例如:

您可以使用以下语法对其进行配置(请参阅URL的最后一部分):



我将允许hibernate创建表,以便为ddl提供良好的数据库抽象。但无论如何,它会有局限性。可能需要一个测试数据库,但如果您能够使用嵌入的fast数据库执行90%的测试,那么它可能是有用的

Oracle Database Express Edition是Oracle数据库,由于它的内存限制为1GB和一个线程(从版本11g开始),因此它的占地面积往往比标准版或企业版要轻。

谢谢,我完全同意将集成与单元测试分开。但有时代码的一些非常基本和基本的部分只能用前面提到的“集成”方法进行测试,因此在开发人员生成代码和相关的单元测试套件之后,代码就远远不安全了。例如,如果您有一个查询“INSERT INTO my_table(good_field,BADD_field)values(?)”,然后模拟您的jdbctemplate,那么您只能测试jdbc采用了某些参数,并且无法检测sql查询中的错误(注意“BADD_field”是一个输入错误),但是在上面的示例中,如果您设置了一个真实的(嵌入式或完整的)db,在查询中很容易检测到输入错误。通常我会通过将obj写入db来进行测试,然后用我正在测试的DAO的另一个方法加载它,然后验证我所写的内容与加载的内容相同。底线是dao上的模拟测试非常有限,当然我们可以通过模拟来隔离服务部分的测试,但是使用模拟来测试dao本身似乎是无用的,您不测试dao,但是您可以在单元测试上测试使用dao的服务层(通过模拟它)。DAO测试可以留给集成测试(例如:在竹CI工具上)一个实用的解决方案可能是使用HSQLDB进行测试。它支持很多Oracle风格的函数,包括date
trunc
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:PUBLIC:syntax.ora=true" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>