【问题标题】:How to cause SpringBoot/Hibernate to create a schema for unit testing?如何使 Spring Boot/Hibernate 创建单元测试模式?
【发布时间】:2019-12-10 14:21:17
【问题描述】:

环境

以 H2 作为测试依赖的 SpringBoot 2。

制作作品

Jar 被部署到云端。 DB2 服务配置有驱动程序和连接详细信息,并自动绑定到 Java 应用程序。 jar 本身没有配置。有 application.properties 文件,但它是空的。这部分工作正常,我希望存在不需要我创建属性文件和配置文件的解决方案。

本地单元测试在“找不到架构 xxx”时崩溃

@Entity(table="Employee", schema="acme")
class Employee {
...
}

@RunWith(SpringRunner.class)
@DataJpaTest
public class EmployeeTest {
...
}
  1. 不存在数据源配置。
  2. SpringBoot 看到 H2 依赖,默认选择 Hibernate。
  3. Hibernate 看到实体定义并尝试首先删除表。
  4. drop 使用架构名称drop table acme.employee if exists。未创建架构,因此进程失败并显示 JdbcSQLSyntaxErrorException: Schema "acme" not found
  5. 我尝试了@TestPropertySource(properties ="jdbc:h2:testb;INIT=CREATE SCHEMA IF NOT EXISTS acme;"),但没有成功。

我在网络上发现了类似的问题和潜在的解决方案。但是它们深入到 Hibernate 和/或 Spring 配置文件中。我真的很想避免这种情况。只有本地单元测试失败,所以我希望找到包含在测试中的解决方案。

【问题讨论】:

标签: java spring hibernate spring-boot h2


【解决方案1】:

如果您的测试需要不同的行为,那基本上就是不同的配置文件。尽管您不喜欢定义属性文件,但下面的解决方案并没有深入配置,并且允许您在测试中非常明确。

  1. 使用以下命令创建 application-test.properties(或 yml,如果您愿意):
spring.datasource.url = jdbc:h2:mem:testb;init=CREATE SCHEMA IF NOT EXISTS acme;
  1. 在您的测试类中选择带有注释@ActiveProfiles 的Spring 配置文件:
@SpringBootTest
@ActiveProfiles("test")
class MyTest {
    ...
}
  1. 试一试。 H2 应该在 Hibernate 尝试创建表之前创建架构。

【讨论】:

    【解决方案2】:

    最简单的方法是使用 h2(或你现在的 hsql),并将 ddl-auto 设置为 create-drop。

    spring:
      datasource:
        driver-class-name: org.h2.Driver
        password:
        url: jdbc:h2:acme
        username: sa
      jpa:
        database-platform: org.hibernate.dialect.H2Dialect
        hibernate:
          ddl-auto: create-drop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 2020-06-25
      • 2016-05-28
      • 2015-07-09
      • 1970-01-01
      • 2020-04-06
      • 2017-07-16
      相关资源
      最近更新 更多