Spring开机。 @DataJpaTest H2 嵌入式数据库创建模式

Spring Boot. @DataJpaTest H2 embedded database create schema

我的数据层中有几个实体存储在特定模式中。例如:

@Entity
@Table(name = "FOO", schema = "DUMMY")
public class Foo {}

我正在尝试设置 H2 嵌入式数据库以对我的数据层进行集成测试。 我在测试中使用 @DataJpaTest 注释来自动配置 H2 嵌入式数据库。但是,创建表失败,因为在数据库初始化时未创建架构 DUMMY

关于在测试用例中创建表之前如何创建模式的任何想法?

我试过使用@Sql(statements="CREATE SCHEMA IF NOT EXISTS DUMMY") 但没有成功。

此外,我尝试在我的 test.properties 文件中将 spring.datasource.url = jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS DUMMYTestPropertySource("classpath:test.properties") 一起设置,但这也不起作用。

我遇到了同样的问题,我设法通过使用内容

创建schema.sql(在资源文件夹中)来解决

CREATE SCHEMA IF NOT EXISTS <yourschema>

可以找到文档 here,但恕我直言,由于缺乏实际示例,它变得非常复杂。 警告:此脚本也在正常(非测试)环境中执行。

不是强制的,但是很好的做法,只在测试范围内添加 h2 依赖

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <scope>test</scope>
</dependency>

经过几个小时的努力,我找到了解决方法。

您可以在 application.properties 中定义 spring.jpa.properties.hibernate.default_schema = DUMMY

然后在你的test.properties中设置spring.jpa.properties.hibernate.default_schema =并与@TestPropertySource("classpath:test.properties")

一起使用

因此,通过这种方式将不会创建 DUMMY 架构,并且会在默认架构中创建实体。

在我的例子中 schema.sqltest/resources 下没用。

test/resources/application.yml 文件中的以下配置有效。

spring:
  datasource:
    username: sa
    password: sa
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:usrmgmt;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL;INIT=CREATE SCHEMA IF NOT EXISTS DUMMY;
  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.xml

在上面的配置中,提供了下面的附加配置

  1. INIT=CREATE SCHEMA IF NOT EXISTS DUMMY 对现有数据库的扩展 url。在没有这个的情况下,面临异常 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "DUMMY" not found;.
  2. spring.liquibase.change-log属性。在没有这个的情况下,面临异常 Caused by: liquibase.exception.ChangeLogParseException: classpath:/db/changelog/db.changelog-master.yaml does not exist.

我想你正在寻找这个注释:

@AutoConfigureTestDatabase(replace=Replace.NONE)

示例:

@DataJpaTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
class UserRepoTest {...}