为什么标注@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
相关产品推荐
相关产品推荐

