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

使用@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:21