【发布时间】:2020-04-22 14:45:33
【问题描述】:
我正在尝试在我的 Spring 引导应用程序中为测试类设置内存 H2 表。
我的配置看起来像:
spring:
jpa:
show-sql: true
generate-ddl: true
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
datasource:
# not sure which one to use so added both just in case
initialization-mode: always
initialize: true
platform: h2
# casting a wide net here, but no cookie - completely ignored
data: data-h2.sql,classpath*:data-h2.sql, classpath:data-h2.sql
url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
driver-class-name: org.h2.Driver
username: sa
password:
如您所见,我正在尝试在数据库初始化时加载data-h2.sql 脚本。
不幸的是,无论值如何,该属性都会被忽略。
我确定配置文件被正确提取(例如,我拼命在我的测试类中添加了一个@Value("${spring.datasource.data}" -annotated 属性,并且该值确实被正确填充)。
作为替代方案,我可以使用确实运行脚本的@Sql("classpath:data-h2.sql") 来注释测试类 - 但是它对每个测试都这样做,而我希望脚本在任何测试执行之前运行一次。
我还尝试删除它并使用空白 schema.sql 并将人口移动到 data.sql(建议 here),但 Spring 会抱怨空架构文件 - 这对我来说没用,因为我的架构是自动生成的,我当然不想重新创建它(注意:如果有记忆,可能与休眠属性发生冲突)。
我浏览了一些答案here,但我唯一可以使用的one 不起作用。
我能看到的唯一解决方案是保留@Sql 注释,但在每次测试后尝试清除表,并使用另一个@Sql 注释在@After 上启动另一个脚本。
这对我来说似乎很疯狂 - 必须有更好的解决方案。
我是否遗漏了一些比我的配置中更深奥的东西?
【问题讨论】:
-
旁注:
ddl-auto属性不应该配置在spring.jpa.hibernate下而不是spring.hibernate下吗? -
@michalk 看起来你是对的 - 感谢您指出这一点
标签: java spring-boot integration-testing h2