1

我有一些集成测试应该模拟出我系统中的许多 bean 之一。为此,我有一个@Configuration看起来像这样的:

@Configuration
public class MockContext {
    @Primary
    @Bean
    public RealBean realBean() {
        return new MockBean();
    }
}

我注意到如果RealBean是一个没有 @Component. 但如果RealBean a @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

4

1 回答 1

2

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

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

当您使用@Component不带属性的注释(指定 bean 名称)时,bean 的名称是从方法名称中提取的,其中第一个字母是小写的

因此,对于您的第一个案例,您会遇到名称冲突。你不能有两个名为realBean.

您的第二个示例没有冲突,因为由 has name 注释的@Componentbean和通过has namerealBean注册的第二个 bean 。@BeangetRealBean

@Primary如果有两个相同类型的 bean 并且您按 type 注入,注解帮助 Spring 选择选择哪个 bean 。当您按名称注入时(使用@Qualifier注释),您也可以注入辅助实例。

于 2015-07-09T18:26:19.510 回答