我经常发现自己处于需要为数据库查询编写自动化测试的情况。我目前的用例是Spring MVC Web应用程序和Postgres数据库。据我所知,我有两个选择:
站起一个实际的Postgres实例并使用测试数据集对其进行初始化 利用H2等内存数据库。 我过去使用过选项#1(尽管有Oracle数据库和Oracle XE)并取得了很好的成功。这种方法的主要缺点是测试不是自包含的。为了成功运行集成测试,您需要实际设置数据库环境,并使其可以从运行测试的任何位置进行访问。 H2解决方案在这方面更具吸引力,因为配置都包含在项目中。
不幸的是,我遇到过H2数据库(在Postgres模式下)的行为与实际的Postgres实例不同的情况。
@Query("SELECT p FROM Project p WHERE "
+ "(:state is NULL or p.state = :state) and "
+ "(:projectType is NULL or p.projectType = :projectType))")
此查询的目的是将两个参数(state和projectType)视为可选。如果客户端提供具有特定值的参数,则返回具有该值的记录。如果没有,则返回所有记录。
此查询适用于H2,但在实际的Postgres实例中失败:
org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = bytea Hint:
No operator matches the given name and argument type(s). You might need to add explicit type casts.
现在我担心我无法相信我的集成测试。这项工作的全部目的是测试我的SQL是否正确。但是现在我不能相信我的SQL是正确的,即使我的所有测试都通过了。
我的问题是,是否有人知道为什么Postgres 9中出现此错误而Postgres模式中没有H2?