使用@RestClientTest测试时如何自动排除所有Repository Bean?
问题:@RestClientTest测试RestClient时触发Repository Bean创建失败
问题现象
测试RestClient服务时,执行测试抛出以下异常:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accountRepository' defined in org.app.domain.account.AccountRepository defined in @EnableJdbcRepositories declared on Application: Cannot resolve reference to bean 'org.springframework.data.jdbc.core.mapping.JdbcMappingContext' while setting bean property 'mappingContext'
尽管@RestClientTest文档说明会禁用完整自动配置,但测试中依然触发了Repository Bean的创建。
测试类代码:
@ActiveProfiles({"test"}) @RestClientTest(value = {AccountServiceClient.class}) public class AccountServiceClientTest { @Autowired private AccountServiceClient serviceClient; @Autowired private MockRestServiceServer mockServer; @Test void testLoginFail() { // 测试逻辑 assertThatCode(() -> mockServer.verify()).doesNotThrowAnyException(); } }
主应用类代码:
@EnableCaching @EnableJdbcRepositories(basePackages = "org.app.domain") @SpringBootApplication(scanBasePackages = "org.app") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
曾尝试在@RestClientTest中添加排除配置,但未生效:
excludeAutoConfiguration = { DataSourceAutoConfiguration.class, JdbcRepositoriesAutoConfiguration.class, JdbcClientAutoConfiguration.class, JdbcTemplateAutoConfiguration.class }
需要找到无需为每个Repository添加@MockBean的自动排除方案。
问题原因
@EnableJdbcRepositories直接标注在主应用类Application上,而@RestClientTest启动测试上下文时,会扫描主应用类所在的包(因@SpringBootApplication的扫描范围),导致@EnableJdbcRepositories被触发,进而尝试创建Repository Bean。此时测试环境未配置数据源相关Bean,因此抛出依赖缺失的异常。添加的自动配置排除项无法阻止主类上注解触发的Repository扫描。
解决方案
将@EnableJdbcRepositories从主应用类移至单独的配置类中,避免测试上下文扫描到该注解:
- 修改主应用类,移除
@EnableJdbcRepositories:
@EnableCaching @SpringBootApplication(scanBasePackages = "org.app") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 创建独立的Repository配置类:
@Configuration @EnableJdbcRepositories(basePackages ="org.app.domain") public class RepositoryConfig {}
这样@RestClientTest测试时,不会自动加载该配置类,也就不会触发Repository Bean的创建,解决了异常问题。
内容的提问来源于stack exchange,提问作者Mike Wallace
相关产品推荐
相关产品推荐

