环境
带有H2作为测试依赖性的Springboot 2。
生产作品
jar被部署到云。DB2服务配置了驱动程序和连接详细信息,并自动绑定到Java应用程序。罐子本身没有配置。有应用程序。专业文件,但它是空的。这部分工作正常,我希望存在一个解决方案,这将不需要我创建属性文件和配置文件。
本地单元测试在"架构xxx找不到"上崩溃'
@Entity(table="Employee", schema="acme")
class Employee {
...
}
@RunWith(SpringRunner.class)
@DataJpaTest
public class EmployeeTest {
...
}
- 不存在数据源配置。
- Springboot看到H2依赖关系,默认情况下选择Hibernate。
- Hibernate看到实体定义并试图先删除表。
- Drop使用架构名称
drop table acme.employee if exists
。没有创建模式,因此JdbcSQLSyntaxErrorException: Schema "acme" not found
。
的过程失败 - 我尝试了
@TestPropertySource(properties ="jdbc:h2:testb;INIT=CREATE SCHEMA IF NOT EXISTS acme;")
没有运气。
我在网络和潜在解决方案上发现了这样的问题。但是它们进入了冬眠和/或春季配置文件。我真的想避免这种情况。这是失败的本地单元测试,因此我希望找到一个包含测试中的解决方案。
如果您的测试需要不同的行为,那基本上是一个不同的配置文件。尽管您不想定义属性文件,但下面的解决方案不会太深地进入配置,并且可以在测试中非常明确。
- 使用: 创建application-test.properties(或YML(
spring.datasource.url = jdbc:h2:mem:testb;init=CREATE SCHEMA IF NOT EXISTS acme;
- 用注释
@ActiveProfiles
中的测试类中选择弹簧配置文件:
@SpringBootTest
@ActiveProfiles("test")
class MyTest {
...
}
- 试一试。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