我经常发现自己想要为数据库查询编写自动化测试。我当前的用例是 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 中?