You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中结合@Configuration配置Neo4j TestContainers的问题

解决TestContainers+Spock测试中自定义Neo4j配置类的使用问题

核心问题

你这问题核心出在:TestContainers启动Neo4j容器后,Spring上下文没把容器的连接信息和你的CustomNeo4jConfiguration配置类正确整合,导致neo4jTemplate这类核心Bean没法正常创建或注入,依赖自定义Bean的测试自然失败。

正确配置步骤

1. 让TestContainers和Spring自动配置协同工作

别直接用@ContextConfiguration硬指定配置类,这种操作会打断Spring Boot自动配置和TestContainers的联动。如果是Spring Boot项目,直接用@SpringBootTest启动完整上下文,TestContainers会自动把容器的连接参数注入到上下文里,同时你的自定义配置类只要被扫描到就能生效。

2. 调整自定义配置类适配动态连接

把CustomNeo4jConfiguration改成能读取TestContainers容器的连接信息,示例代码:

@Configuration
@EnableNeo4jRepositories(basePackages = "com.yourpackage.repositories")
public class CustomNeo4jConfiguration {

    @Autowired
    private Neo4jContainer<?> neo4jContainer;

    @Bean
    public Neo4jTemplate neo4jTemplate() {
        return new Neo4jTemplate(sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() {
        // 用容器的动态连接信息构建OGM配置
        org.neo4j.ogm.config.Configuration ogmConfig = new org.neo4j.ogm.config.Configuration.Builder()
                .uri(neo4jContainer.getBoltUrl())
                .credentials(neo4jContainer.getAdminUsername(), neo4jContainer.getAdminPassword())
                .build();
        return new SessionFactory(ogmConfig, "com.yourpackage.domain");
    }

    // 你的自定义回调Bean
    @Bean
    public Neo4jCallback customNeo4jCallback() {
        return new CustomNeo4jCallbackImpl();
    }
}

3. Spock测试类的正确写法

结合@SpringBootTest和@Testcontainers注解,让容器自动启动并注入上下文:

@SpringBootTest
@Testcontainers
class YourNeo4jSpec extends Specification {

    // 声明静态容器实例,TestContainers会自动管理生命周期
    @Container
    static Neo4jContainer<?> neo4jContainer = new Neo4jContainer<>("neo4j:5.12")
            .withAdminPassword("test")

    @Autowired
    private Neo4jTemplate neo4jTemplate;

    @Autowired
    private Neo4jCallback customNeo4jCallback;

    def "测试自定义回调功能"() {
        when:
        def result = customNeo4jCallback.doSomething(neo4jTemplate)

        then:
        result == expectedValue
    }
}

4. 非Spring Boot项目的处理方式

如果不是Spring Boot项目,必须用@ContextConfiguration的话,要手动把容器的连接参数注册到Spring上下文:

@ContextConfiguration(classes = [CustomNeo4jConfiguration])
@Testcontainers
class YourNeo4jSpec extends Specification {

    @Container
    static Neo4jContainer<?> neo4jContainer = new Neo4jContainer<>("neo4j:5.12")

    // 动态注册Neo4j连接属性到Spring
    @DynamicPropertySource
    static void configureNeo4jProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.neo4j.uri", neo4jContainer::getBoltUrl)
        registry.add("spring.neo4j.authentication.username", neo4jContainer::getAdminUsername)
        registry.add("spring.neo4j.authentication.password", neo4jContainer::getAdminPassword)
    }

    // 测试逻辑...
}

对应的配置类可以直接用Spring的Neo4jProperties读取参数:

@Configuration
public class CustomNeo4jConfiguration {

    @Autowired
    private Neo4jProperties neo4jProperties;

    @Bean
    public SessionFactory sessionFactory() {
        org.neo4j.ogm.config.Configuration ogmConfig = new org.neo4j.ogm.config.Configuration.Builder()
                .uri(neo4jProperties.getUri())
                .credentials(neo4jProperties.getAuthentication().getUsername(), neo4jProperties.getAuthentication().getPassword())
                .build();
        return new SessionFactory(ogmConfig, "com.yourpackage.domain");
    }

    // 其他Bean...
}

排查关键点

  • 确认CustomNeo4jConfiguration在Spring的扫描范围内(比如和启动类同包,或者用@ComponentScan指定扫描路径)。
  • 测试里可以加个断言验证容器是否正常启动:assert neo4jContainer.isRunning()。
  • 查看日志里的Bean创建错误,大概率是连接参数没传对导致SessionFactory初始化失败,进而引发neo4jTemplate找不到。

内容的提问来源于stack exchange,提问作者rwachter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:36:26