春季启动。 @DataJpaTest H2嵌入式数据库创建模式

时间:2016-08-19 11:24:45

标签: spring-boot integration-testing h2 spring-test embedded-database

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

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

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

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

我试图使用@Sql(陈述="创建模式,如果不是DUMMY")但是没有成功。

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

3 个答案:

答案 0 :(得分:15)

我有同样的问题,我设法通过创建带有内容的schema.sql(在资源文件夹中)解决

CREATE SCHEMA IF NOT EXISTS <yourschema>

可以找到文档here,但是由于缺乏真实的例子,因此非常复杂。 警告:此脚本也在正常(非测试)环境中执行。

不是强制性的,但是好的做法是,仅在测试范围中添加h2依赖性

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

就我而言,schema.sql 下的 test/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
相关问题