我有一些集成测试,应该模拟出系统中许多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

最佳答案

您可以使用相同的类型注册各种bean。但是他们需要使用不同的名称。

如果使用@Bean注释without name attribute,则从方法名称(在您的情况下为realBean / getRealBean)中提取bean的名称。

当使用不带属性的@Component注释(指定bean名称)时,bean的名称是从方法名称first letter is lowercased中提取的。

因此,在第一种情况下,您会遇到名称冲突。您不能有两个名为realBean的bean。

您的第二个示例没有冲突,因为用@Component注释的bean名称为realBean,通过@Bean注册的第二个bean名称为getRealBean

@Primary注释可帮助Spring选择是否存在两个相同类型的bean并按类型注入。当按名称注入(使用@Qualifier批注)时,也可以注入辅助实例。

10-08 14:33