使用嵌入式Flapdoodle MongoDB执行文档检查时遇到问题
使用嵌入式Flapdoodle MongoDB执行JUnit测试时遇到问题
我太懂这种挫败感了——在生产或本地真实MongoDB上跑代码好好的,一用嵌入式版本做JUnit测试就掉链子!你提到用了de.flapdoodle.embed.mongo.spring3x:4.11.0这个依赖,结合我碰到过的类似问题,给你几个实用的排查方向:
- 先核对Spring版本适配性:你用的是
spring3x后缀的依赖包,这是专门适配Spring 3.x版本的。如果你的项目是Spring Boot 2.x或3.x,版本不匹配肯定会出问题!赶紧换成对应版本的适配包:Spring Boot 3.x用de.flapdoodle.embed.mongo.spring-boot3,Spring Boot 2.x用de.flapdoodle.embed.mongo.spring-boot2,版本号可以保持4.11.0或者匹配你的Spring Boot版本找对应的兼容版。 - 检查测试环境的连接配置:嵌入式Mongo不会自动和你的测试代码“无缝对接”,得明确告诉测试用例怎么连它。比如在测试类上加个
@TestPropertySource(properties = {"spring.data.mongodb.uri=mongodb://localhost:27017/test-junit-db"}),指定连接到嵌入式Mongo的测试库;或者写个配置类手动初始化嵌入式Mongo实例,指定端口和存储路径。 - 排查依赖冲突:项目里如果同时引入了官方MongoDB驱动、Spring Data MongoDB的包,很可能和Flapdoodle的依赖版本打架。用Maven的
mvn dependency:tree或者Gradle的./gradlew dependencies命令拉取依赖树,看看有没有重复或者版本不兼容的Mongo相关依赖,把冲突的排除掉。 - 盯紧启动日志找线索:很多时候问题藏在启动日志里,你可以把
de.flapdoodle包的日志级别调到DEBUG,这样能看到嵌入式Mongo是不是成功下载了二进制文件、端口有没有被占用、启动时有没有抛出异常。比如在logback-test.xml里加一行<logger name="de.flapdoodle" level="DEBUG"/>,就能拿到详细日志了。 - 确认测试上下文配置:如果用的是
@SpringBootTest,别不小心排除了嵌入式Mongo的自动配置类;如果是自定义测试上下文,要确保嵌入式Mongo的Bean被正确初始化并注入到测试代码里。比如有些时候会因为上下文加载顺序问题,导致Mongo连接还没建立就开始执行测试方法,自然会失败。
备注:内容来源于stack exchange,提问作者Luís Casqueiro




