如何在Spring Boot测试中覆写Spring Cloud Bootstrap上下文的Bean
方法1:自定义测试专属Bootstrap配置类
- 第一步:在测试代码目录下创建自定义Bootstrap配置类,提前注册你需要的ApiClient实例:
@Configuration public class TestBootstrapConfiguration { @Bean public ApiClient mockApiClient() { // 在此返回自定义的测试用ApiClient实例 return new MockApiClient(); } }
- 第二步:在测试类路径的
src/test/resources/META-INF/spring.factories文件中添加如下配置,让Spring Cloud优先加载你的测试配置:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\ TestBootstrapConfiguration,\ MyBootstrapConfiguration
Spring Cloud加载Bootstrap配置时会按照spring.factories中声明的顺序加载,你的配置放在第三方配置前面,ApiClient会先被你注册,第三方标注了@ConditionalOnMissingBean的Bean就不会被创建。
方法2:通过测试属性指定Bootstrap配置顺序
如果不想新增spring.factories文件,可以直接在测试类上通过属性配置指定加载顺序:
@SpringBootTest @TestPropertySource(properties = { "spring.cloud.bootstrap.sources=TestBootstrapConfiguration,MyBootstrapConfiguration" }) public class YourTest { // 测试逻辑 }
spring.cloud.bootstrap.sources属性会覆盖spring.factories中扫描到的Bootstrap配置类列表,你自定义的配置放在前面即可优先注册Bean。
方法3:开启Bootstrap上下文MockBean支持(Spring Boot 2.2+适用)
默认@MockBean只会作用于主应用上下文,你可以通过开启配置让Mock对象也注入到Bootstrap上下文:
@SpringBootTest(properties = { "spring.cloud.bootstrap.add-mock-beans=true" }) @MockBean(ApiClient.class) public class YourTest { @Autowired private ApiClient apiClient; @Test void testBizLogic() { // 直接对mock对象做stub配置即可 when(apiClient.invoke(any())).thenReturn("test result"); // 业务测试逻辑 } }
这个方法不需要额外编写配置类,开启开关后@MockBean创建的代理对象会提前注入到Bootstrap上下文,自动触发@ConditionalOnMissingBean的跳过逻辑。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

