【问题标题】:Is there a way where we can test Postgres Jsonb queries using embedded database for Unit Testing?有没有一种方法可以让我们使用嵌入式数据库来测试 Postgres Jsonb 查询以进行单元测试?
【发布时间】:2020-05-12 13:54:09
【问题描述】:

我想在 Java Spring-boot Postgres 本机查询中对 jsonb 数据类型进行单元测试,而不会触及实际的 DB。而不是使用一些嵌入式数据库或其他方法,但是像 H2 这样的嵌入式数据库不支持 Postgres jsonb 特定运算符,如 @987654322 @、#>>

有什么办法可以解决这个问题吗?也请提出任何其他相同的方法。

查询示例:

@Query(value = "SELECT * FROM table WHERE column ->> 'Id'=?1", nativeQuery = true)
public Entity fertchById(String id);

【问题讨论】:

  • 使用类似 testcontainers 的东西来引导 PostgreSQL,这确实需要 docker 可用。嵌入式解决方案不起作用,jsonb 的东西适用于 PostgreSQL,所以不使用另一个数据库来测试 Postgres 特定的东西显然不起作用。
  • 如果你需要一个像 Postgres 一样工作和行为的数据库,你唯一的选择是使用 Postgres。如果您想知道您的查询是否在 Postgres 上正常工作,任何针对“模拟数据库”的测试都将毫无意义
  • 我同意你应该在 Testcontainers 上使用 postgres。但是这里有答案stackoverflow.com/a/50837767/66686

标签: java postgresql spring-boot jsonb embedded-database


【解决方案1】:

如果您使用的是 H2 数据库,并且希望在不使用 docker 和 testcontainers(在 cmets 中提到)的情况下使用 JSONB PostgreSQL 功能,您可以定义您的自定义 H2 方言。

我找到了这样一个方言的例子here

public class CustomH2Dialect extends H2Dialect {

    public CustomH2Dialect() {
        this.registerColumnType(Types.JAVA_OBJECT, "jsonb");
    }


    @Override
    public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
        super.contributeTypes(typeContributions, serviceRegistry);
        typeContributions.contributeType(new JsonStringType(), "jsonb");
    }
}

您可以看到 Liquibase 的问题仍然存在,您绝对应该考虑 testcontainers 或其他直接使用 PostgreSQL 的方式。

【讨论】:

  • 我可以将 H2 与 jsonb 一起使用,但对于 postgres 特定的运算符,它不提供任何支持,并且为了允许 H2 存储 JSONB,您可以在属性文件中使用其他数据类型创建域,同时将 h2 定义为datasource.Example:spring.datasource.url=jdbc\:h2\:mem\:db;DB_CLOSE_ON_EXIT\=TRUE;MODE\=PostgreSQL;INIT\=CREATE SCHEMA IF NOT EXISTS schema\\;CREATE domain IF NOT EXISTS jsonb AS其他;
  • Jagjit 的方法帮我解决了,其他都没用,我现在正在使用:url: jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;INIT=create schema if not exists myschema\;CREATE domain IF NOT EXISTS jsonb AS other;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多