@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.projectreactorFlux.class 所属)作为间接依赖,这是我们问题的根源。

Spring Data Neo4j 将在本周晚些时候在补丁中修复此问题。