使用@DataMongoTest测试MongoRepository时出现连接超时问题
问题原因分析
你遇到的连接拒绝错误,核心原因是手动指定了MongoDB固定端口27017,但Flapdoodle嵌入式MongoDB默认会启动在随机端口,导致测试代码试图连接一个未启动服务的固定端口,最终连接失败。同时还有几处配置冗余可能加重问题。
解决方案
1. 修正MongoDB配置,移除固定端口
删除application.yaml中spring.data.mongodb.port配置项,让Spring自动适配嵌入式MongoDB的随机端口:
de: flapdoodle: mongodb: embedded: version: 4.6.1 spring: datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 username: sa password: sa jpa: show-sql: true hibernate: ddl-auto: create-drop database-platform: org.hibernate.dialect.H2Dialect properties: hibernate: default_schema: public data: mongodb: database: database # 移除port配置,让嵌入式Mongo自动分配端口
2. 移除冗余的@EnableMongoRepositories注解
@DataMongoTest注解已经自动包含了Mongo Repository的扫描功能,无需手动添加@EnableMongoRepositories。如果HistoryRepository不在测试类的同级或子包下,可通过@DataMongoTest的basePackageClasses属性指定位置:
@ExtendWith(SpringExtension.class) @DataMongoTest(basePackageClasses = HistoryRepository.class) @TestInstance(TestInstance.Lifecycle.PER_CLASS) class RatingHistoryRepositoryTest { @Autowired private HistoryRepository historyRepository; @BeforeAll public void setUp() { HistoryWrapper wrapper1 = generateHistoryWrapper(SIREN_1); historyRepository.save(wrapper1); } // 测试方法... }
3. 确认依赖是否正确
确保测试依赖中包含Spring Boot的Mongo测试starter,它内置了Flapdoodle嵌入式MongoDB支持:
- Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-test</artifactId> <scope>test</scope> </dependency>
- Gradle:
testImplementation 'org.springframework.boot:spring-boot-starter-data-mongodb-test'
4. 调整初始化时机(可选)
使用@TestInstance(TestInstance.Lifecycle.PER_CLASS)时,@BeforeAll会在类初始化阶段执行,可能出现Repository未完全就绪的情况。可改用@BeforeEach,确保每次测试前数据初始化可靠:
@BeforeEach public void setUp() { historyRepository.deleteAll(); // 清空数据避免测试污染 HistoryWrapper wrapper1 = generateHistoryWrapper(SIREN_1); historyRepository.save(wrapper1); }
内容的提问来源于stack exchange,提问作者Romain Huber
相关产品推荐
相关产品推荐

