集成测试阶段在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
相关产品推荐
相关产品推荐

