Spring 启动测试似乎正在创建与我预期不同的 H2 测试数据库
Spring Boot Test seems to be creating H2 Test DB different than what I would expect
所以,我有一个用 @DataJpaTest
和 @RunWith(SpringRunner.class)
注释的测试,以及 /src/test/resources 下的 application.yml 和这个块(是的,缩进应该没问题):
spring:
datasource:
url: jdbc:h2:mem:foobar;MODE=Mysql;MVCC=FALSE;
username: sa
password:
driver-class-name: org.h2.Driver
当我开始测试时,我意外地在日志中得到这些行:
2019-10-23 17:11:08.311 INFO 13468 --- [ main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version
2019-10-23 17:11:08.801 INFO 13468 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url='jdbc:h2:mem:7855270f-61b7-4f37-8796-cbfeb8ad42ea;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
特别是这个:Starting embedded database: url='jdbc:h2:mem:7855270f-61b7-4f37-8796-cbfeb8ad42ea;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false
为什么 Spring 启动一个带有 UUID 生成的数据库的数据库而不是从 spring.datasource.url 中获取设置?
"productive" 应用程序从 /src/main/resources 中的文件中获取数据源设置,语法相同,没有问题...
从@DataJpaTest的文档可以看出:
@DataJpaTest uses an embedded in-memory
database (replacing any explicit or usually auto-configured
DataSource). The @AutoConfigureTestDatabase annotation can be used to
override these settings.
所以 @DataJpaTest 用 @AutoConfigureTestDatabase
注释导致 TestDatabaseAutoConfiguration
使用硬编码 generateUniqueName(true)
:
创建嵌入式数据源
TestDatabaseAutoConfiguration.java :
EmbeddedDatabase getEmbeddedDatabase() {
...
return new EmbeddedDatabaseBuilder()
.generateUniqueName(true)
.setType(connection.getType())
.build();
}
我认为他们这样做是为了防止数据库名称冲突和测试运行之间的状态混合。
所以,我有一个用 @DataJpaTest
和 @RunWith(SpringRunner.class)
注释的测试,以及 /src/test/resources 下的 application.yml 和这个块(是的,缩进应该没问题):
spring:
datasource:
url: jdbc:h2:mem:foobar;MODE=Mysql;MVCC=FALSE;
username: sa
password:
driver-class-name: org.h2.Driver
当我开始测试时,我意外地在日志中得到这些行:
2019-10-23 17:11:08.311 INFO 13468 --- [ main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version
2019-10-23 17:11:08.801 INFO 13468 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url='jdbc:h2:mem:7855270f-61b7-4f37-8796-cbfeb8ad42ea;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
特别是这个:Starting embedded database: url='jdbc:h2:mem:7855270f-61b7-4f37-8796-cbfeb8ad42ea;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false
为什么 Spring 启动一个带有 UUID 生成的数据库的数据库而不是从 spring.datasource.url 中获取设置?
"productive" 应用程序从 /src/main/resources 中的文件中获取数据源设置,语法相同,没有问题...
从@DataJpaTest的文档可以看出:
@DataJpaTest uses an embedded in-memory database (replacing any explicit or usually auto-configured DataSource). The @AutoConfigureTestDatabase annotation can be used to override these settings.
所以 @DataJpaTest 用 @AutoConfigureTestDatabase
注释导致 TestDatabaseAutoConfiguration
使用硬编码 generateUniqueName(true)
:
TestDatabaseAutoConfiguration.java :
EmbeddedDatabase getEmbeddedDatabase() {
...
return new EmbeddedDatabaseBuilder()
.generateUniqueName(true)
.setType(connection.getType())
.build();
}
我认为他们这样做是为了防止数据库名称冲突和测试运行之间的状态混合。