如何引起Springboot/Hibernate创建用于单元测试的模式



环境

带有H2作为测试依赖性的Springboot 2。

生产作品

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

本地单元测试在"架构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. 的过程失败
  6. 我尝试了@TestPropertySource(properties ="jdbc:h2:testb;INIT=CREATE SCHEMA IF NOT EXISTS acme;")没有运气。

我在网络和潜在解决方案上发现了这样的问题。但是它们进入了冬眠和/或春季配置文件。我真的想避免这种情况。这是失败的本地单元测试,因此我希望找到一个包含测试中的解决方案。

如果您的测试需要不同的行为,那基本上是一个不同的配置文件。尽管您不想定义属性文件,但下面的解决方案不会太深地进入配置,并且可以在测试中非常明确。

  1. 使用:
  2. 创建application-test.properties(或YML(
spring.datasource.url = jdbc:h2:mem:testb;init=CREATE SCHEMA IF NOT EXISTS acme;
  1. 用注释@ActiveProfiles中的测试类中选择弹簧配置文件:
@SpringBootTest
@ActiveProfiles("test")
class MyTest {
    ...
}
  1. 试一试。H2应该在Hibernate试图创建表之前创建模式。

这样做的绝对最简单方法是使用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

最新更新