@SpringBootTest 在做IT的时候加载不需要的Bean
@SpringBootTest loads unrequired Bean when making IT
我正在为我的应用程序进行一些集成测试,我遇到了这个问题,我不知道如何解决。
我正在使用 Spring Boot 2.4.13 + Spring Data Neo4J 6.1.9
仅供参考,我删除了通过 Spring Initializr 创建项目时捆绑的应用程序默认测试,在 /src/test/resources 下我有一个名为 application.yml[= 的 .yml 文件17=]
我的 IT class 看起来像这样:
@SpringBootTest
public class ClientIT {
@Autowired
private ClientServiceImpl service;
@Autowired
private ClientRepository repository;
@Test
void someTest() {
//Given
//When
//Then
}
}
但是当我 运行 这个测试时,我得到以下异常:
java.lang.IllegalStateException: Failed to load ApplicationContext
这就是原因:
Caused by: java.lang.IllegalStateException: The provided database selection provider differs from the ReactiveNeo4jClient's one.
问题是我在我的项目中根本没有使用 SDN 的反应特性。我什至不明白为什么 Spring 试图加载它。我在 Spring Data Neo4j GitHub 存储库 (https://github.com/spring-projects/spring-data-neo4j/issues/2488) 下创建了一个问题,但他们只能告诉我,如果有驱动程序或 Flux class,ReactiveNeo4jDataAutoConfiguration 会自动包含在内在我没有的class路径中。
在使用 JUnit Jupiter 方法启动应用程序时,我一直在调试 Spring 内部结构,但没有成功。
我看到的是,在 JUnit Jupiter 测试后的某个时刻 preparation/initialization,“reactiveNeo4jTemplate”被注入到 DefaultListableBeanFactory 的 beanDefinitionNames 变量中。
我已经尝试了多种不同注释的组合,这些注释旨在在进行集成测试时使用,但有一次它起作用是在我明确排除 ReactiveNeo4jDataAutoConfiguration class through
之后
@EnableAutoConfiguration(exclude=ReactiveNeo4jDataAutoConfiguration.class)
我在一些博文中经常看到的是,通过使用@SpringBootTest,我不应该担心这类问题,但看起来我每次都需要添加注释进行新的 IT 测试。
我的集成测试基本上包括引导应用程序 + 网络服务器 (tomcat) 以及嵌入式 Neo4J 实例,然后发出请求以检查一切是否正常工作。我真的需要担心所有这些只是为了进行这些简单的测试吗?
谢谢
参考文献:
How do I set up a Spring Data Neo4j integration test with JUnit 5 (in Kotlin)?
在找到导致此错误的原因后回答我自己的问题:
在链接的 Github 问题中,一位开发人员表示,在类路径中具有 Flux.class
会强制 SDN 实例化 Neo4jReactiveDataAutoConfiguration
,这就是导致其他反应 bean 实例化的原因。
显然,neo4j-harness
通过 neo4j-fabric
带来了 io.projectreactor
(Flux.class
所属)作为间接依赖,这是我们问题的根源。
Spring Data Neo4j 将在本周晚些时候在补丁中修复此问题。
我正在为我的应用程序进行一些集成测试,我遇到了这个问题,我不知道如何解决。
我正在使用 Spring Boot 2.4.13 + Spring Data Neo4J 6.1.9
仅供参考,我删除了通过 Spring Initializr 创建项目时捆绑的应用程序默认测试,在 /src/test/resources 下我有一个名为 application.yml[= 的 .yml 文件17=]
我的 IT class 看起来像这样:
@SpringBootTest
public class ClientIT {
@Autowired
private ClientServiceImpl service;
@Autowired
private ClientRepository repository;
@Test
void someTest() {
//Given
//When
//Then
}
}
但是当我 运行 这个测试时,我得到以下异常:
java.lang.IllegalStateException: Failed to load ApplicationContext
这就是原因:
Caused by: java.lang.IllegalStateException: The provided database selection provider differs from the ReactiveNeo4jClient's one.
问题是我在我的项目中根本没有使用 SDN 的反应特性。我什至不明白为什么 Spring 试图加载它。我在 Spring Data Neo4j GitHub 存储库 (https://github.com/spring-projects/spring-data-neo4j/issues/2488) 下创建了一个问题,但他们只能告诉我,如果有驱动程序或 Flux class,ReactiveNeo4jDataAutoConfiguration 会自动包含在内在我没有的class路径中。
在使用 JUnit Jupiter 方法启动应用程序时,我一直在调试 Spring 内部结构,但没有成功。
我看到的是,在 JUnit Jupiter 测试后的某个时刻 preparation/initialization,“reactiveNeo4jTemplate”被注入到 DefaultListableBeanFactory 的 beanDefinitionNames 变量中。
我已经尝试了多种不同注释的组合,这些注释旨在在进行集成测试时使用,但有一次它起作用是在我明确排除 ReactiveNeo4jDataAutoConfiguration class through
之后@EnableAutoConfiguration(exclude=ReactiveNeo4jDataAutoConfiguration.class)
我在一些博文中经常看到的是,通过使用@SpringBootTest,我不应该担心这类问题,但看起来我每次都需要添加注释进行新的 IT 测试。
我的集成测试基本上包括引导应用程序 + 网络服务器 (tomcat) 以及嵌入式 Neo4J 实例,然后发出请求以检查一切是否正常工作。我真的需要担心所有这些只是为了进行这些简单的测试吗?
谢谢
参考文献:
How do I set up a Spring Data Neo4j integration test with JUnit 5 (in Kotlin)?
在找到导致此错误的原因后回答我自己的问题:
在链接的 Github 问题中,一位开发人员表示,在类路径中具有 Flux.class
会强制 SDN 实例化 Neo4jReactiveDataAutoConfiguration
,这就是导致其他反应 bean 实例化的原因。
显然,neo4j-harness
通过 neo4j-fabric
带来了 io.projectreactor
(Flux.class
所属)作为间接依赖,这是我们问题的根源。
Spring Data Neo4j 将在本周晚些时候在补丁中修复此问题。