You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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从主应用类移至单独的配置类中,避免测试上下文扫描到该注解:

  1. 修改主应用类,移除@EnableJdbcRepositories:
@EnableCaching
@SpringBootApplication(scanBasePackages = "org.app")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  1. 创建独立的Repository配置类:
@Configuration
@EnableJdbcRepositories(basePackages ="org.app.domain")
public class RepositoryConfig {}

这样@RestClientTest测试时,不会自动加载该配置类,也就不会触发Repository Bean的创建,解决了异常问题。

内容的提问来源于stack exchange,提问作者Mike Wallace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:40:17