Spring 启动测试 H2 sql 脚本未加载
Spring boot test H2 sql script not being loaded
所以我在尝试加载架构和数据的 .sql 脚本时遇到问题。
默认情况下我的脚本没有被加载,因为当我的测试试图从 H2 数据库中获取数据时,显示消息“Table”未找到。
脚本位于“src/test/resources”文件夹中。
pom 中的 H2 依赖项:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
当我放置注释“@Sql(scripts = { "/schema.sql", "/data.sql" }) 时,我看到下一个错误:
java.lang.IllegalStateException: Failed to execute SQL scripts for
test context [DefaultTestContext@7090eaec testClass =
MicroserviceControllerTest, testInstance =
sche.invm.backend.rke.asn2019.get.controller.MicroserviceControllerTest@180274b1,
testMethod = testGetPerson@MicroserviceControllerTest, testException =
[null], mergedContextConfiguration =
[WebMergedContextConfiguration@5158e446 testClass =
MicroserviceControllerTest, locations = '{}', classes = '{class
sche.invm.backend.rke.asn2019.get.GetApplication}',
contextInitializerClasses = '[]', activeProfiles = '{test}',
propertySourceLocations = '{}', propertySourceProperties =
'{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true,
server.port=0}', contextCustomizers =
set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@30bbcf91,
org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@52b959df,
org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0,
org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@31834a2b,
org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0,
org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@34c53688,
org.springframework.boot.test.context.SpringBootTestArgs@1,
org.springframework.boot.test.context.SpringBootTestWebEnvironment@6127a7e],
resourceBasePath = 'src/main/webapp', contextLoader =
'org.springframework.boot.test.context.SpringBootContextLoader',
parent = [null]], attributes =
map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener'
-> false]]: could not obtain DataSource from transaction manager [org.springframework.orm.jpa.JpaTransactionManager] (named '').
这是我测试的配置:
这是我用@Sql注解测试的配置:
¿可能是什么错误?
我的应用配置了多租户,我不知道这是否会导致此特定错误。
最后的问题是,在我的服务应用程序中,属性“exclude = {DataSourceAutoConfiguration.class}”在@SpringBootApplication() 中被声明,删除它后我的测试运行没问题。
还有一点是因为我的服务是多租户的,所以我不得不在我的属性文件中配置,除了我的多租户的url,还有url的spring.datasource (这是因为我的多租户 url 是以下 jdbc: h2: mem: testdb,但是数据库 h2 是这样设置 url jdbc: h2: mem: 718e98df -3d08-46de-99e3-6ec4dc725293,所以脚本正在这个数据库中执行,而另一个数据库没有任何这些表)。
我希望它能被理解(我的英语不是最好的)
这是我的测试属性文件的一部分:
spring.datasource.url:jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username= sa
spring.datasource.password=
#multitenant datasources
datasources.0.tenant=CL
datasources.0.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
datasources.0.username=sa
datasources.0.password=
所以我在尝试加载架构和数据的 .sql 脚本时遇到问题。
默认情况下我的脚本没有被加载,因为当我的测试试图从 H2 数据库中获取数据时,显示消息“Table”未找到。
脚本位于“src/test/resources”文件夹中。 pom 中的 H2 依赖项:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
当我放置注释“@Sql(scripts = { "/schema.sql", "/data.sql" }) 时,我看到下一个错误:
java.lang.IllegalStateException: Failed to execute SQL scripts for test context [DefaultTestContext@7090eaec testClass = MicroserviceControllerTest, testInstance = sche.invm.backend.rke.asn2019.get.controller.MicroserviceControllerTest@180274b1, testMethod = testGetPerson@MicroserviceControllerTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@5158e446 testClass = MicroserviceControllerTest, locations = '{}', classes = '{class sche.invm.backend.rke.asn2019.get.GetApplication}', contextInitializerClasses = '[]', activeProfiles = '{test}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true, server.port=0}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@30bbcf91, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@52b959df, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@31834a2b, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@34c53688, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@6127a7e], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> false]]: could not obtain DataSource from transaction manager [org.springframework.orm.jpa.JpaTransactionManager] (named '').
这是我测试的配置:
这是我用@Sql注解测试的配置:
¿可能是什么错误? 我的应用配置了多租户,我不知道这是否会导致此特定错误。
最后的问题是,在我的服务应用程序中,属性“exclude = {DataSourceAutoConfiguration.class}”在@SpringBootApplication() 中被声明,删除它后我的测试运行没问题。
还有一点是因为我的服务是多租户的,所以我不得不在我的属性文件中配置,除了我的多租户的url,还有url的spring.datasource (这是因为我的多租户 url 是以下 jdbc: h2: mem: testdb,但是数据库 h2 是这样设置 url jdbc: h2: mem: 718e98df -3d08-46de-99e3-6ec4dc725293,所以脚本正在这个数据库中执行,而另一个数据库没有任何这些表)。
我希望它能被理解(我的英语不是最好的)
这是我的测试属性文件的一部分:
spring.datasource.url:jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username= sa
spring.datasource.password=
#multitenant datasources
datasources.0.tenant=CL
datasources.0.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
datasources.0.username=sa
datasources.0.password=