17

我有一个java配置类直接提供fooBean和通过组件扫描提供barBean。

@Configuration
@ComponentScan(basePackages = { "com.blah" })
public class Config {

    @Bean
    public FooBean fooBean {
        return new FooBean();
    }
}

我想在测试用例中重用它,我需要用模拟替换bean:

@Configuration
@Import(Config.class)
public class TestConfig {

    @Bean
    public FooBean fooBean {
        return new FooBeanMock();
    }

    @Bean
    public BarBean barBean {
        return new BarBeanMock();
    }
}

(这里重用 Config 没有多大意义,但在现实生活中我有 1000 个 Bean,我只需要模拟几个)

这里 fooBean 被覆盖,但 barBean 没有。

Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML.

还有一个官方问题: https ://jira.springsource.org/browse/SPR-9682

有人知道覆盖组件扫描发现的 bean 的任何解决方法吗?

考虑到 bean 是遗留代码并且不能被修改,并且它的依赖项没有设置器(私有属性 + @Resource)。

4

2 回答 2

8

尝试跳过不必要的 bean:

@ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class}))
于 2013-04-12T14:41:31.780 回答
-1

是的,您可以覆盖组件扫描发现的 bean。我在测试用例中这样做。我使用 XML 配置,但我认为 Java 配置会非常相似。

春天.xml:

 <context:component-scan base-package="cz.backend"/>

MyBeanImpl.java

@Component("myBean")
public class MyBeanImpl implements MyBean {
   //Something
}

在测试文件夹中,我有:

弹簧测试.xml:

<import resource="classpath:/spring.xml"/>
<bean id="myBean" class="cz.backend.MyBeanTestMock"/>

MyBeanTestMock.java:

public class MyBeanTestMock implements MyBean {
    //Something
}

覆盖 bean 的名称必须相同。

于 2015-07-23T08:25:56.413 回答