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

Spring Boot嵌入式MongoDB测试报错:embeddedMongoServer Bean创建失败

问题描述

我有一个基于Spring Boot的实验性服务,使用MongoDB作为数据库。引入de.flapdoodle.embed:de.flapdoodle.embed.mongo依赖编写单元测试时,出现以下错误:

java.lang.IllegalStateException: Failed to load ApplicationContext.

开启调试日志后,得到详细错误信息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Could not start process: <EOF>

单元测试类 UserRepositoryTest

package com.gitgrub.userservice.repository;

import com.gitgrub.userservice.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.test.context.ActiveProfiles;

import static org.junit.jupiter.api.Assertions.*;

@DataMongoTest
@ActiveProfiles("test")
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void findByUsername() {
        String testUsername = "testUser";
        User user = new User(testUsername, "test@example.com", "password");
        userRepository.save(user);

        User foundUser = userRepository.findByUsername(testUsername);
        assertNotNull(foundUser);
        assertEquals(testUsername, foundUser.getUsername());
    }

    @Test
    void findByEmail() {
        String testEmail = "test@example.com";
        User user = new User("testUser", testEmail, "password");
        userRepository.save(user);

        User foundUser = userRepository.findByEmail(testEmail);
        assertNotNull(foundUser);
        assertEquals(testEmail, foundUser.getEmail());
    }

    @Test
    void findByUsernameOrEmail() {
        String testUsername = "testUser";
        String testEmail = "test@example.com";
        User user1 = new User(testUsername, "user1@example.com", "password");
        User user2 = new User("user2", testEmail, "password");

        userRepository.save(user1);
        userRepository.save(user2);

        User foundUser1 = userRepository.findByUsernameOrEmail(testUsername, "");
        assertNotNull(foundUser1);
        assertEquals(testUsername, foundUser1.getUsername());

        User foundUser2 = userRepository.findByUsernameOrEmail("", testEmail);
        assertNotNull(foundUser2);
        assertEquals(testEmail, foundUser2.getEmail());
    }
}

被测试接口 UserRepository

/**
 * UserRepository是处理User数据的数据访问对象(DAO)接口。
 * 它继承自MongoRepository,以利用Spring Data MongoDB的功能,
 * 包括CRUD操作和数据库查询。
 *
 * 该仓库提供了通过用户名、邮箱,或用户名/邮箱任一条件查找用户的方法。
 *
 * 应用的其他组件(如服务和控制器)会使用该仓库与数据库中的User数据交互。
 *
 */

package com.gitgrub.userservice.repository;

import com.gitgrub.userservice.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User, String> {
    User findByUsername(String username);

    User findByEmail(String email);

    User findByUsernameOrEmail(String username, String email);

}
解决方案

出现Could not start process: <EOF>错误,核心是嵌入式MongoDB启动失败,常见修复方法如下:

  • 版本兼容校验:确保Spring Boot与flapdoodle embed mongo版本匹配,最好依赖Spring Boot的依赖管理自动协调版本,避免手动指定:

    <!-- Maven 依赖配置 -->
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <scope>test</scope>
    </dependency>
    

    Gradle 配置:

    testImplementation 'de.flapdoodle.embed:de.flapdoodle.embed.mongo'
    
  • 解决二进制下载问题:嵌入式Mongo需要自动下载对应平台的二进制文件,若网络受限导致下载失败,可手动下载指定版本的MongoDB二进制包,然后通过配置指定本地路径:
    在application-test.yml中配置:

    spring:
      data:
        mongodb:
          embedded:
            version: 4.4.6 # 与你下载的二进制包版本一致
    

    或通过系统属性指定本地下载源:

    System.setProperty("de.flapdoodle.mongo.distribution.baseUrl", "file:///本地Mongo二进制包路径/");
    
  • 检查系统权限:嵌入式Mongo启动时需要写入临时文件的权限,确保当前用户有权限操作临时目录(如Linux的/tmp、Windows的临时文件夹)。

  • 清理冲突配置:检查application-test.yml,不要手动指定spring.data.mongodb.uri,避免覆盖Spring Boot的嵌入式Mongo自动配置逻辑。

  • 适配CPU架构:如果是ARM架构设备(如M1/M2 Mac),需指定支持ARM的MongoDB版本,比如:

    spring:
      data:
        mongodb:
          embedded:
            version: 5.0.15
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:42