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

32

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

@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 DUMMY,并且与TestPropertySource("classpath:test.properties")一起使用,但也无效。

4个回答

33

我曾经遇到了同样的问题,通过创建一个包含以下内容的schema.sql文件(位于resources文件夹下)解决了问题:

CREATE SCHEMA IF NOT EXISTS <yourschema>

文档可以在这里找到,但是缺少真实示例使其变得非常复杂。

虽然不是必需的,但是在测试范围内仅添加h2依赖项是一个好习惯。

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

谢谢回复。它有效!顺便说一句,你对依赖范围的抓取很好。 - StasKolodyuk
另外,我已经找到了这个问题的另一个解决方案,只是忘记在这里放置它了。 - StasKolodyuk
11
原来你可以将 schema.sql 放在 src/test/resources 下,这样它就只会应用于测试。 - StasKolodyuk

7

我认为您正在寻找以下注释:

@AutoConfigureTestDatabase(replace=Replace.NONE)

示例:

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

我希望这将删除/丢弃您的生产数据库,而不是使用H2。 - Chris

3

经过数小时的艰辛探索,我找到了一个解决方法。

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

然后,在test.properties中设置spring.jpa.properties.hibernate.default_schema =,并与@TestPropertySource("classpath:test.properties")一起使用。

这样,便不会创建DUMMY模式,并且实体将被创建在默认模式中。


1
您还可以使用@TestPropertySource(properties = "spring.jpa.properties.hibernate.default_schema=...") - GreenGiant

2
在我的情况下,test/resources下的schema.sql没有起作用。
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. 在现有的DB url中添加INIT=CREATE SCHEMA IF NOT EXISTS DUMMY扩展。如果没有这个扩展,将会遇到异常: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接