Java 如何在不使用概要文件的情况下覆盖测试的Spring启动应用程序属性?
我发现关于在Spring Boot中使用一个主生产数据库进行典型设置和在mem db中进行测试的所有信息都非常缺乏Java 如何在不使用概要文件的情况下覆盖测试的Spring启动应用程序属性?,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我发现关于在Spring Boot中使用一个主生产数据库进行典型设置和在mem db中进行测试的所有信息都非常缺乏 测试属性没有约定,测试中的application.properties显然会覆盖main中的属性,并且没有类似application-test.properties->application.properties的回退机制。我不想使用概要文件,因为我希望它们严格定义环境,这是另一个维度(本地、生产),我需要笛卡尔产品main local、test local、main produ
- 测试属性没有约定,测试中的application.properties显然会覆盖main中的属性,并且没有类似application-test.properties->application.properties的回退机制。我不想使用概要文件,因为我希望它们严格定义环境,这是另一个维度(本地、生产),我需要笛卡尔产品main local、test local、main production、test production
- 所以我要让Spring为我变魔术,所以我在RepositoryTest上设置@DataJpaTest注释。Spring当然会动态创建H2DB,但我没有找到一种方法来设置自定义模式或启用H2控制台,因为application.properties会被忽略
另外,我认为简单的方法是通过
@SpringBootTest(properties={“h2.console.enabled:true”,“h2.console.path:/myconsole”}覆盖测试中的属性
但是我找不到@DataJpaTest绑定它们的方法您可以提供第二个application.yml/application.properties,用于路径src/test/resources
处的测试。位于测试上下文中的文件用于测试,当您运行应用程序时,将使用位于src/main/resources
的文件
例如,生产配置(使用postgres和ddl自动验证来保存数据)位于src/main/resources
:
spring:
datasource:
url: jdbc:postgresql://localhost/postgres
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: validate
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
以及放置在src/test/resources
的测试配置(使用H2和ddl自动创建下拉列表):
spring:
datasource:
url: jdbc:postgresql://localhost/postgres
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: validate
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
您可以在路径
src/test/resources
处提供第二个application.yml/application.properties用于测试。位于测试上下文中的文件用于测试,当您运行应用程序时,将使用位于src/main/resources
的文件
例如,生产配置(使用postgres和ddl自动验证来保存数据)位于src/main/resources
:
spring:
datasource:
url: jdbc:postgresql://localhost/postgres
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: validate
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
以及放置在src/test/resources
的测试配置(使用H2和ddl自动创建下拉列表):
spring:
datasource:
url: jdbc:postgresql://localhost/postgres
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: validate
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
H2控制台需要一个在
DataJpaTest
中不可用的web环境。为什么要在临时内存数据库中设置自定义模式?要轻松调试所有数据库工作,在spring中注册bean的传统方法是调用org.h2.server,我不知道为什么要配置webenv,我在预引导spring中从来都不需要它。我真的认为配置文件正是您要找的。我知道您可能只想以某种方式使用它们,但这是许多开发人员使用它们的用例之一。也可以使用您的构建工具,如根据需要将所需的属性文件复制到您的运行时环境中,但我宁愿使用profiles.H2控制台需要一个在DataJpaTest
中不可用的web环境。为什么要在内存数据库中设置一个自定义模式?要轻松调试所有db工作,传统的方式在春季注册bean是通过调用org.h2.server,我不知道为什么我们应该配置webenv,我从来没有需要它在启动前spring中我真的认为配置文件正是您要寻找的。我知道您可能只想以某种方式使用它们,但这是许多开发人员使用它们的用例之一。也可以使用您的构建工具,如根据需要将所需的属性文件复制到您的运行时环境中,但我更愿意使用配置文件。