@EnableAutoConfiguration(exclude =...) Spring Boot 2.6.0 中的测试失败

@EnableAutoConfiguration(exclude =...) on tests failed in Spring Boot 2.6.0

我试图将我的数据-mongo 示例项目升级到 Spring Boot 2.6.0。有一个针对 Testcontainers 运行 的测试,我还包括了用于其他测试的嵌入式 mongo dep,所以我必须排除嵌入式 mongo 的自动配置以确保此测试正常工作Docker/testcontainers.

以下配置适用于 Spring Boot 2.5.6


@DataMongoTest
@ContextConfiguration(initializers = {MongodbContainerInitializer.class})
@EnableAutoConfiguration(exclude = EmbeddedMongoAutoConfiguration.class)
@Slf4j
@ActiveProfiles("test")
public class PostRepositoryTest {}

但是在升级到 Spring Boot 2.6.0 并 运行 应用程序后,我得到了这样的异常。

[           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: o
rg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/autoconfig
ure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Unsatisfied dependency expressed through method 'embeddedMongoServer' parameter 0; nested exception is org.springframework.bea
ns.factory.BeanCreationException: Error creating bean with name 'embeddedMongoConfiguration' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/Embed
dedMongoAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [de.flap
doodle.embed.mongo.config.MongodConfig]: Factory method 'embeddedMongoConfiguration' threw exception; nested exception is java.lang.IllegalStateException: Set the spring.mongodb.embedd
ed.version property or define your own MongodConfig bean to use embedded MongoDB

显然,@EnableAutoConfiguration(exclude =...) 在升级到 Spring Boot 2.6.0 时不会影响测试中的上下文。

更新:暂时解决了,看我下面的回答。

从 Spring Boot 2.6 开始,属性 spring.mongodb.embedded.version 必须设置为使用自动配置的嵌入式 MongoDB。它在发行说明中提到:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes#embedded-mongo

这也是您发布的错误消息,建议您这样做:Set the spring.mongodb.embedd ed.version property or define your own MongodConfig bean to use embedded MongoDB

注解 @DataMongoTest 使用 @ImportAutoConfiguration@AutoConfigureDataMongo 进行元注解,旨在触发 MongoDB 的自动配置,除非像您在工作配置示例。

在您的第一个配置示例中,注释 @EnableAutoConfiguration(exclude = EmbeddedMongoAutoConfiguration.class) 不会覆盖 @DataMongoTest 的效果。

使用 Spring Boot 2.5.6,自动配置的 MongodConfig bean 很可能也是应用程序上下文的一部分,但没有得到有效使用。但这取决于代码的其余部分,特别是 MongodbContainerInitializer.

在升级到 Spring Boot 2.6.0 时,在测试 类 上使用 @ImportAutoConfiguration(exclude = ...)@DataMongoTest(excludeAutoConfiguration = ...) 来克服这个障碍。

@DataMongoTest
@ImportAutoConfiguration(exclude = EmbeddedMongoAutoConfiguration.class)
//other config are ommitted
public class PostRepositoryTest {}

//or 
@DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)
public class PostRepositoryTest {}

只需添加:

@TestPropertySource(properties = "spring.mongodb.embedded.version=3.5.5")

注释你的单元测试之前它会开始工作。

@Henning 的回答很好地解释了为什么需要这个。