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

集成测试阶段在Test Container中加载Neo4j数据库dump文件

加载Neo4j Dump文件到TestContainers的步骤

步骤1:准备Dump文件

将你的Neo4j dump文件(例如test-dump.dump)放到项目的src/test/resources目录下,方便测试时读取。

步骤2:配置Neo4j TestContainer

你可以通过两种方式实现dump文件的导入,以下是具体代码示例:

方式一:启动容器时执行导入命令

直接替换容器默认启动流程,先导入dump再启动Neo4j服务:

import org.junit.jupiter.api.Test;
import org.testcontainers.containers.Neo4jContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.MountableFile;

@Testcontainers
public class Neo4jIntegrationTest {

    @Container
    private static final Neo4jContainer<?> neo4jContainer = new Neo4jContainer<>("neo4j:5.15.0")
            .withAdminPassword("test-password")
            // 把本地dump文件复制到容器临时目录
            .withCopyFileToContainer(MountableFile.forClasspathResource("test-dump.dump"), "/tmp/test-dump.dump")
            // 先导入dump再启动服务
            .withStartupCommand("/bin/sh", "-c", 
                "neo4j-admin load --from=/tmp/test-dump.dump --database=neo4j --force && neo4j start && wait-for-it localhost:7687 -- echo 'Neo4j ready'");

    @Test
    void testWithLoadedData() {
        // 在此编写测试逻辑,此时Neo4j已加载dump中的数据
        String boltUrl = neo4jContainer.getBoltUrl();
        // 使用boltUrl连接数据库进行测试
    }
}

方式二:容器启动后手动导入

先启动容器,再复制文件、停止服务、导入dump,最后重启服务:

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.Neo4jContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.MountableFile;

@Testcontainers
public class Neo4jIntegrationTest {

    @Container
    private static final Neo4jContainer<?> neo4jContainer = new Neo4jContainer<>("neo4j:5.15.0")
            .withAdminPassword("test-password");

    @BeforeAll
    static void loadDumpData() {
        // 复制本地dump到容器
        neo4jContainer.copyFileToContainer(MountableFile.forClasspathResource("test-dump.dump"), "/tmp/test-dump.dump");
        
        // 停止Neo4j服务(neo4j-admin load需要数据库离线)
        neo4jContainer.execInContainer("neo4j", "stop");
        
        // 执行导入命令,--force参数覆盖现有数据库
        neo4jContainer.execInContainer(
            "neo4j-admin", "load", "--from=/tmp/test-dump.dump", "--database=neo4j", "--force"
        );
        
        // 重启服务并等待就绪
        neo4jContainer.execInContainer("neo4j", "start");
        neo4jContainer.waitingFor(org.testcontainers.containers.wait.strategy.Wait.forListeningPort());
    }

    @Test
    void testWithLoadedData() {
        // 测试逻辑
    }
}

关键注意事项

  • 版本匹配:确保TestContainers使用的Neo4j镜像版本,和生成dump文件的Neo4j版本完全一致,避免兼容性问题。
  • 数据库名称:如果dump是针对特定数据库的,需在neo4j-admin load命令中通过--database=<db-name>指定,默认数据库名为neo4j。
  • 服务就绪等待:导入完成后必须等待Neo4j服务完全启动,才能执行测试逻辑,避免连接失败。

内容的提问来源于stack exchange,提问作者amit kumar gyandeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:05:23