【问题标题】:Spring Boot. @DataJpaTest H2 embedded database create schema弹簧靴。 @DataJpaTest H2 嵌入式数据库创建模式
【发布时间】:2016-12-26 13:04:28
【问题描述】:

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

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

我正在尝试设置 H2 嵌入式数据库以对我的数据层进行集成测试。 我在测试中使用@DataJpaTest 注释来自动配置H2 嵌入式数据库。但是,由于在 DB 初始化时未创建架构 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"),但这也没有用。

【问题讨论】:

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


    【解决方案1】:

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

    @AutoConfigureTestDatabase(replace=Replace.NONE)

    示例:

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

    【讨论】:

      【解决方案2】:

      在我的情况下,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

      【讨论】:

        【解决方案3】:

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

        CREATE SCHEMA IF NOT EXISTS <yourschema>

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

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

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

        【讨论】:

        • 感谢您的回复。有用!顺便说一句,关于依赖范围很好。
        • 另外,我已经为这个问题找到了另一种解决方案,只是忘记放在这里了。
        • 原来可以把schema.sql放在src/test/resources下面,只用于测试
        【解决方案4】:

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

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

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

        因此,这种方式不会创建 DUMMY 架构,而是在默认架构中创建实体。

        【讨论】:

        • 你也可以使用@TestPropertySource(properties = "spring.jpa.properties.hibernate.default_schema=...")
        猜你喜欢
        • 2023-04-01
        • 2016-08-30
        • 2019-07-25
        • 1970-01-01
        • 2016-02-10
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多