【发布时间】:2020-04-05 19:20:10
【问题描述】:
我有一个 SpringBootTest 测试,它应该依赖一个单独的类来设置嵌入式 Postgres 和数据源。
所以存储库配置如下所示:
package com.stream.repository.configuration
@Configuration
@ComponentScan(basePackages = arrayOf("com.stream.repository"))
@EntityScan(basePackages = arrayOf("com.stream.repository"))
@EnableJpaRepositories(basePackages = arrayOf("com.stream.repository"))
@EnableAutoConfiguration
class RepositoryConfiguration {
而测试类看起来是这样的:
package com.stream.webapp.rest
@AutoConfigureMockMvc(addFilters = false)
@SpringBootTest(properties =
[
"spring.jpa.hibernate.ddl-auto=validate",
"spring.jpa.show-sql=true",
"spring.liquibase.enabled=true",
"spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yml",
"spring.jpa.properties.hibernate.jdbc.time_zone=UTC"
],
classes = [RepositoryConfiguration::class, AuditController::class],
webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class AuditControllerTest {
这就是奇怪的地方。如果我使用该配置运行,它会抱怨找不到EntityManagerFactory
AuditService 需要一个找不到的“javax.persistence.EntityManagerFactory”类型的 bean。
经过很多的折腾,我找到了解决这个问题的办法。
如果我将RepositoryConfiguration 移动到包com.stream.webapp.rest 中,即与AuditControllerTest 相同,那么它会神奇地起作用。
我似乎找不到 任何 原因来说明为什么会出现这种情况。那么任何人都可以解释它,有没有办法解决它?因为我不想动它。把它放在它所在的地方很有意义。
作为旁注,它是用 Kotlin 编写的,但我不明白为什么它在这种情况下很重要。 这仅用于测试。在测试范围之外运行应用程序时,它可以工作
我还可以补充一点,AuditControllerTest 在一个模块中,RepositoryConfiguration 在另一个模块中。不确定它是否相关,因为如果它被放置在“正确”的包中(仍然是单独的模块)
TL;DR 的问题:为什么 spring 关心 RepositoryConfiguration 与 AuditControllerTest 在同一个包中?
更新:这是当前配置:(RepositoryConfiguration 不变
@AutoConfigureMockMvc(addFilters = false)
@ComponentScan("com.stream.repository")
@Configuration
@SpringBootTest(properties =
[
"spring.jpa.hibernate.ddl-auto=validate",
"spring.jpa.show-sql=true",
"spring.liquibase.enabled=true",
"spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yml",
"spring.jpa.properties.hibernate.jdbc.time_zone=UTC",
"database.dbname=stream_mapper"
],
classes = [com.stream.repository.configuration.RepositoryConfiguration::class, ExceptionMapper::class, AuditController::class],
webEnvironment = SpringBootTest.WebEnvironment.MOCK)
class AuditControllerTest {
【问题讨论】:
-
在引用 com.stream.repository 包的测试中添加@ComponentScan 注解是否有效?
-
遗憾的是没有。我尝试将
@ComponentScan和@ComponentScan("com.stream.repository")添加到AuditControllerTest类中,但我仍然收到未找到EntityManagerFactory的错误 -
用@Configuration注解怎么样?
-
看起来也不起作用(同样的错误)。我会用最新的配置更新我的帖子
-
如果您提供一个最小的、可重现的示例,则更容易识别问题:stackoverflow.com/help/minimal-reproducible-example
标签: java spring-boot testing kotlin spring-boot-test