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
相关产品推荐
相关产品推荐

