使用 Spring Boot 2.1,默认情况下禁用 bean 覆盖,这是一件好事。
但是我确实进行了一些测试,其中我使用 Mockito 将 beans 替换为模拟实例。使用默认设置,具有此类配置的测试将由于 bean 覆盖而失败。
我发现唯一可行的方法是通过应用程序属性启用 bean 覆盖:
spring.main.allow-bean-definition-overriding=true
但是,我真的很想确保为我的测试配置设置最小的 bean 定义设置,spring 会在禁用覆盖的情况下指出这一点。
我要覆盖的豆是
- 在导入到我的测试配置中的另一个配置中定义
- 通过注解扫描自动发现的bean
我的想法应该在覆盖 bean 的测试配置中起作用,并在其上打一个 @Primary
,就像我们习惯于数据源配置一样。然而,这没有任何效果,让我想知道: @Primary
和禁用的 bean 是否相互矛盾?
一些例子:
package com.stackoverflow.foo;
@Service
public class AService {
}
package com.stackoverflow.foo;
public class BService {
}
package com.stackoverflow.foo;
@Configuration
public BaseConfiguration {
@Bean
@Lazy
public BService bService() {
return new BService();
}
}
package com.stackoverflow.bar;
@Configuration
@Import({BaseConfiguration.class})
public class TestConfiguration {
@Bean
public BService bService() {
return Mockito.mock(BService.class);
}
}
原文由 hotzst 发布,翻译遵循 CC BY-SA 4.0 许可协议
覆盖 beans 意味着上下文中可能只有一个具有唯一名称或 id 的 bean。所以你可以通过以下方式提供两个bean:
如果添加
@Primary
则主 bean 将默认注入到: