Spring Boot测试中如何使用Mongo TestContainer覆盖spring.data.mongodb.uri
解决方案
- 排查是否存在单独的MongoDB连接属性配置
Spring Data MongoDB 自动配置逻辑中,显式配置的spring.data.mongodb.host、spring.data.mongodb.port等单属性优先级高于spring.data.mongodb.uri,哪怕你已经正确覆盖了uri,只要其他地方(包括默认配置、父上下文配置)存在单独的host/port配置,就会优先用这些参数拼接连接串,忽略uri配置。
你可以在测试运行时输出所有spring.data.mongodb前缀的配置项,确认是否有遗漏的单独配置未被覆盖,如果有,在@DynamicPropertySource中同步覆盖:
@DynamicPropertySource static void mongoDbProperties(DynamicPropertyRegistry registry) { String containerUri = MongoInitializer.MongoContainerSingleton.getInstance().getReplicaSetUrl("testdb"); registry.add("spring.data.mongodb.uri", () -> containerUri); // 覆盖所有可能存在的单独配置,避免优先级冲突 registry.add("spring.data.mongodb.host", () -> ""); registry.add("spring.data.mongodb.port", () -> ""); registry.add("spring.data.mongodb.database", () -> "testdb"); }
- 手动注册MongoClient强制覆盖自动配置
如果上述方法不生效,可以直接在测试配置类中自定义MongoClient Bean,优先级高于Spring Boot的自动配置,会强制使用TestContainer的地址:
@SpringBootTest public class MongoTest { @Bean public MongoClient mongoClient() { return MongoClients.create(MongoInitializer.MongoContainerSingleton.getInstance().getReplicaSetUrl("testdb")); } // 你的测试方法 }
这种方式不会影响非测试场景的配置,因为该Bean只在测试上下文加载。
- 排查自定义Mongo配置类是否存在硬编码
检查项目中是否有自定义的MongoTemplate、MongoClient配置类,如果配置类中硬编码了localhost:27017的连接地址,或者没有从Environment中读取最新的uri配置,也会导致连接地址不生效。如果有这类配置,可以给生产环境的配置类加@Profile("!test")注解,让其在测试场景不生效。
内容的提问来源于stack exchange,提问作者kristof.taveirne
相关产品推荐
相关产品推荐

