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

为什么标注@DataMongoTest的测试不访问内存MongoDB而连真实库?

问题场景

我正在为MongoRepository自定义方法类编写测试,以下是需要测试的Repository方法:

public interface DataRepository extends MongoRepository<Data, String> {

    List<Data> getBySizeId(String sizeId);
    List<Data> findAllBy();
    List<Data> findAllBySizeId(List<String> sizeId);
}

以下是测试类代码:

@DataMongoTest
class DataRepositoryTest {

    @Autowired
    private DataRepository underTest;

    @Test
    void create() {
        //Given
        String id = UUID.randomUUID().toString();
        Data Data = new Data();
        Data.setId(id);
        //When
        underTest.save(Data);
        //Then
        Optional<Data> optionalData = underTest.findById(id);
        assertThat(optionalData)
                .isPresent();
    }

    @Test
    void delete() {
        //Given
        //When
        //Then
    }

    @Test
    void getBySizeId() {
        //Given
        String SizeId = UUID.randomUUID().toString();

        Data Data1 = new Data();
        Data1.setSizeId(SizeId);

        Data Data2 = new Data();
        Data2.setSizeId(SizeId);

        Data Data3 = new Data();
        Data3.setSizeId(SizeId);

        List<Data> DataList = Arrays.asList(Data1, Data2, Data3);

        //When
        underTest.saveAll(DataList);// assume that is works correct

        //Then
        List<Data> dataArray = underTest.getBySizeId(SizeId);
        assert(dataArray.stream().count() == 3);
    }
}

我在DataRepositoryTest类上标注了@DataMongoTest注解,根据官方文档说明:

默认情况下,标注了@DataMongoTest的测试会使用嵌入式内存MongoDB进程。

但我运行测试时,测试方法访问的是真实数据库的文档,而非内存MongoDB,请问是什么原因导致未按文档默认规则使用内存MongoDB?

原因及解决方案
  • 缺失嵌入式MongoDB依赖
    Spring Boot默认不会自动引入嵌入式MongoDB的依赖包,需要手动添加flapdoodle的嵌入式Mongo依赖到测试依赖中。如果检测不到嵌入式Mongo的实现,Spring会自动降级使用配置文件中指定的真实MongoDB数据源。Maven示例配置:
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>
  • 测试类叠加了全上下文加载注解
    如果测试类同时标注了@SpringBootTest等全量加载Spring上下文的注解,会覆盖@DataMongoTest的切片测试自动配置逻辑,直接读取全局配置中的数据源。只需删除额外的全上下文注解即可恢复切片测试的默认配置。
  • 测试配置中显式指定了MongoDB连接参数
    如果src/test/resources下的配置文件(如application.properties、application.yml)中显式配置了spring.data.mongodb.uri、spring.data.mongodb.host等连接参数,手动配置的优先级高于测试自动生成的嵌入式Mongo配置,就会连接到指定的真实库。可以删除测试配置中的MongoDB连接参数,或者添加@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)注解强制使用测试数据源。
  • 存在自定义MongoClient的Bean配置
    如果项目中自定义了MongoClient类型的Bean,且没有限定仅在正式环境加载,测试上下文启动时会优先使用自定义的MongoClient,跳过自动配置的嵌入式Mongo连接。可以给自定义MongoBean添加@Profile("!test")注解,避免测试环境加载该Bean。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:54:02