Spring Boot @DataMongoTest排除类配置失效问题求助
问题根因
你遇到的问题是:@DataMongoTest的excludeFilter配置没有生效,PersonProfileRepository仍然被Spring Data MongoDB扫描到,进而因为缺少该Repository对应的@BeforeSaveEvent处理Bean的依赖,导致测试失败。
这是因为Spring Data Repository的扫描逻辑独立于普通@ComponentScan的过滤规则,excludeFilter主要用于过滤@Component、@Service等普通组件,对Spring Data Repository接口的扫描不生效。从日志也能看出,Spring Data正在扫描com.foo.cloud.landing.page.personprofile和com.foo.cloud.landing.page.posts两个包的Repository。
解决方案
方案1:限制@DataMongoTest的扫描范围(推荐)
直接在@DataMongoTest上指定basePackages,只包含PostRepository所在的包,从根源上避免扫描到其他Repository:
@DataMongoTest( properties = { "spring.data.mongodb.auto-index-creation=true", "spring.data.mongodb.database=landingpage_db_test", "spring.data.mongodb.port=17017", "foo.cloud.landing.page.mongodb.primary.uri=mongodb://localhost:17017/landingpage_db_test", "foo.cloud.landing.page.mongodb.secondary.uri=mongodb://localhost:17017/event-materializer_test", "logging.level.com.foo.cloud=DEBUG", "logging.level.kafka=WARN", "logging.level.org.apache=WARN", "logging.level.org.eclipse=WARN", "logging.level.org.springframework=DEBUG", "logging.level.root=INFO", "runtime-env=dev", "spring.application.name=landingpage", "spring.cloud.vault.enabled=false", "spring.cloud.config.enabled=false", "spring.main.banner-mode=off", "spring.mongodb.embedded.version=3.4.6" }, basePackages = "com.foo.cloud.landing.page.posts" ) public class PostRepositoryTest { // 测试代码 }
方案2:用@EnableMongoRepositories精准指定Repository扫描包
在测试类上额外添加@EnableMongoRepositories,明确指定只扫描PostRepository所在的包,覆盖Spring Data默认的Repository扫描行为:
@DataMongoTest( properties = { // 原有的properties配置 } ) @EnableMongoRepositories(basePackages = "com.foo.cloud.landing.page.posts") public class PostRepositoryTest { // 测试代码 }
方案3:修正excludeFilter的过滤类型(仅适用于普通组件,对Repository效果有限)
如果坚持使用排除方式,需要修正excludeFilter的过滤类型为ASSIGNABLE_TYPE(默认是按注解过滤),但注意这个方式对Repository的扫描可能依然无效,仅推荐用于过滤普通配置类/组件:
@DataMongoTest( properties = { // 原有的properties配置 }, excludeFilters = { @ComponentScan.Filter( type = FilterType.ASSIGNABLE_TYPE, classes = {PersonProfileRepository.class, LandingPageConfig.class, WebClientConfig.class, SecondaryMongoConfig.class} ) } )
总结
最可靠的方式是直接限制Repository的扫描范围(方案1或方案2),从根本上避免扫描到不需要的Repository,从而解决依赖缺失的问题。
内容的提问来源于stack exchange,提问作者Anadi Misra

