我有一些集成测试应该模拟我系统中的许多bean之一。为此,我有@Configuration
,如下所示:
@Configuration
public class MockContext {
@Primary
@Bean
public RealBean realBean() {
return new MockBean();
}
}
我注意到如果RealBean
是一个没有 @Component
的java类,则会使用此方法。但是,如果RealBean
是@Component
,我必须将此上下文方法更改为:
@Configuration
public class MockContext {
@Primary
@Bean
public RealBean getRealBean() {
return new MockBean();
}
}
任何人都可以解释为什么我需要更改此方法名称以及我可以在哪里找到所有这些规则?解决这些问题需要很长时间才能解决问题,为什么我的MockContext
工作正常?"的问题。
FWIW,以下是我在测试中如何使用此上下文:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RealContext.class, MockContext.class})
@WebAppConfiguration
public abstract class AbstractIntegrationTest {
我的集成测试将扩展此类。我正在使用Spring Boot 1.2.4.RELEASE
答案 0 :(得分:2)
您可以使用相同类型注册各种bean。但他们需要有不同的名字。
如果使用@Bean
注释without name attribute,则从方法名称(在您的情况下为realBean / getRealBean)中提取bean的名称。
当您使用不带属性的@Component
注释(指定bean名称)时,将从方法名称first letter is lowercased中提取bean的名称。
因此,在您的第一个案例中,您会收到名称冲突。您不能拥有两个名为realBean
的bean。
您的第二个示例没有冲突,因为@Component
注释的bean名称为realBean
,而@Bean
注册的第二个bean名称为getRealBean
。
@Primary
注释有助于Spring选择要选择哪个bean,如果有两个相同的类型并且按类型注入。当您按名称注入(使用@Qualifier
注释)时,您也可以注入辅助实例。