我遵循H2文档说要使用Postgresql模式,使用数据库URL jdbc:h2:〜/ test; MODE = Postgresql或sql语句SET MODE Postgresql.
我使用SET MODE Postgresql启用模式,我试图点燃一个涉及rank()的查询,并在postgres中工作,但它没有工作H2.它给我以下例外
Function "RANK' not found; in sql statement
请指导我是新的H2和数据库测试.提前致谢.我使用H2 jdbc驱动程序通过思考H2 Posgress兼容性模式来触发后台查询,以允许我触发后台查询.
解决方法
So I thought of using H2 Posgresql compatibility mode by thinking all postgres queries will work on H2 please correct me if I am wrong
恐怕不是这样.
H2尝试模拟Postgresql语法并支持一些功能和扩展.它不会完全匹配Postgresql的行为,并且不支持所有功能.
你唯一的选择是:
>在测试中使用Postgresql要么
>停止使用H2不支持的功能
我建议使用Pg进行测试.编写initdb的postgres实例的测试工具相对来说比较简单,然后启动测试工具进行测试,然后将其撕下来.
更新基于评论:
“单位”和“整合”测试之间没有硬线.在这种情况下,H2也是外部组件.纯粹的单元测试将有一个虚拟的响应者查询作为测试工具的一部分.对H2的测试与对Postgresql的测试一样是一个“集成”测试.它在进程和内存中的事实是一个方便,但不是功能上的重要.
如果要进行单元测试,应该为应用程序编写另一个数据库目标,以便与“Postgresql”,“SybaseIQ”等目标一起使用.称之为“MockDatabase”.这应该只是从查询返回预期的结果.它没有真正运行查询,它只存在来测试其余代码的行为.
就个人而言,我认为这是一个巨大的时间浪费,但是这是纯粹主义者的一个单位测试,以避免将外部依赖性引入到测试工具中.
如果您坚持使用单元(而不是集成)对您的DB组件进行测试,但是不能/不会写入模拟界面,则必须找到一种使用现有模块的方法. H2将是合理的候选对象 – 但是您必须使用新的可用于H2的查询集编写新的后端,不能仅仅重新使用Postgresql后端.正如我们已经建立的,H2不支持您需要使用Postgresql的所有功能,因此您必须找到与H2完全相同的方法.一个选择是使用“预期”结果创建一个简单的H2数据库,并返回这些结果的简单查询,完全忽略实际应用程序的架构.这里唯一真正的缺点是,维护可能是一个重大的痛苦…但这是单元测试.
就我个人而言,我只是用Postgresql测试.除非我正在测试独立的单独的课程或模块,这些单独的单元是狭窄接口的定义良好的单元,我不在乎是否有人称之为“单元”或“集成”测试.我会单元测试,比如数据验证类.对于数据库接口代码,纯粹的单元测试没有什么意义,我只需要进行集成测试.
虽然具有进程内存数据库方便,但不是必需的.您可以编写测试工具,以便设置代码initdbs一个新的Postgresql并启动它;那么拆卸代码会杀死postmaster并删除datadir.我在this answer写了更多关于这个.
也可以看看:
> Running PostgreSQL in memory only
至于:
If all queries with expected end datasets works fine in Postgress I can assume it will work fine in all other dbs
如果我明白你正在说的正确,那么是的,那就是这种情况 – 如果你的代码的其余部分与Postgresql中的数据集一起工作,它通常与包含来自另一个数据库的相同数据的数据集相同.只要它使用简单的数据类型,不是数据库特定的功能,当然.