使用集成测试触发器在内存数据库中初始化 JDBC 兼容?

Posted

技术标签:

【中文标题】使用集成测试触发器在内存数据库中初始化 JDBC 兼容?【英文标题】:Initialize JDBC compliant in memory database with triggers for integration testing? 【发布时间】:2014-08-01 18:06:08 【问题描述】:

目前,我们有一个用于所有集成测试的数据库实例。 oracle 数据库模式由一堆 DDL 同步。然后我们使用 DBunit 在测试之间填充和截断表。这种方法有两个问题:

    准备数据库的时间超过了测试时间 有时,通常是测试失败,测试数据会溢出到后续测试并导致更多失败。

我想通过为每个测试创建一个内存数据库(例如 h2)来隔离测试。我计划配置 EclipseLink 以生成 DDL(因为将 oracle DDL 转换为其他东西将是我想象的一场噩梦)。那时唯一的问题是创建触发器。

所以我有两个问题...

    我能否从现有的 oracle 模式创建一个内存数据库(h2 或其他),包括触发器? 或者,我可以使用我的 entitymanager(DDL 生成)创建一个内存数据库,并在测试执行之前动态创建一堆触发器吗?

技术栈:

春天:3.2.8 Spring Data JPA:1.5.3 Eclipse 链接:2.5.1 甲骨文:11

我熟悉如何实例化 Spring Test Integration 环境以加载内存数据库。只是不知道如何翻译 oracle 的东西(特别是触发器)。

【问题讨论】:

【参考方案1】:

我能否从现有的 oracle 模式创建一个内存数据库(h2 或其他),包括触发器?

是的,你可以拥有这个。我们对所有物理数据库使用 Postgres,对内存数据库使用 HSQL。我们开始使用 hibernate 从实体类生成数据库,但现在已经迁移到使用 Flyway。请记住,您的一些 DML 和 DDL 将针对 Oracle 进行自定义,因此您必须针对 HSQL 或 H2 进行自定义(使用 Flyway 很容易做到)。

或者,我可以使用我的 entitymanager(DDL 生成)创建一个内存数据库并在测试执行之前动态创建一堆触发器吗?

您可以根据需要清理/填充内存数据库。有多种方法:

    Flyway 测试扩展 - 这使它变得简单,是我们使用的。 https://github.com/flyway/flyway-test-extensions。 编写一个 Spring bean,它有一个测试配置文件 @Profile("test") 并将插入测试环境的数据。 使用 import.sql 脚本。我相信 Spring 测试工具会寻找这个。

【讨论】:

谢谢,谢谢。我目前正在研究飞行路线扩展。

以上是关于使用集成测试触发器在内存数据库中初始化 JDBC 兼容?的主要内容,如果未能解决你的问题,请参考以下文章

在内存数据库中使用 H2 进行 Spring Boot 集成测试

在 spring-boot 集成测试中使用 H2 数据库的 JDBC 连接错误

使用 Spring Boot 在单元测试中配置集成测试或使用 Spring JDBC?

内存数据库中的 H2:使用 JDBC 设置时区? Java 单元测试

如何准备在内存替换中使用 PostgreSQL 的集成测试?

使用 @MockBean 的 Spring Boot 集成测试不释放 jdbc 连接