测试中的Spring配置通过常规配置覆盖

时间:2017-06-14 16:20:30

标签: spring spring-test

我遇到了一个问题,我为我的源代码创建了一个Configuration类,并为我的测试包创建了一个单独的配置类。我想在测试中创建一些与其他环境不同的bean。然而,当我在这里运行构建时发生了什么:(我有一个名为filesystem的bean,它在测试中为我提供了一个虚拟文件系统)

Overriding bean definition for bean 'fileSystem' with a different definition: replacing <testVersion from MockAppInjector> with <realVersionFromAppInjector>

我是我的测试包

@Configuration
@ImportResource("classpath:/META-INF/fig-batch/spring-bootstrap.xml")
@ComponentScan(basePackages = "com.company")
class MockAppInjector {...}

在我的常规源包中

@Configuration
@ImportResource("classpath:/META-INF/fig-batch/spring-bootstrap.xml")
@ComponentScan(basePackages = "com.company")
public class AppInjector {...}

在我的测试中,我有@ContextConfiguration(classes = MockAppInjector.class)

最后,我的所有xml都包含<context:component-scan base-package="com.company" />,并调用另一个配置一些数据源的xml。

2 个答案:

答案 0 :(得分:1)

问题是,由于某些原因,XML中定义的任何bean都比Java配置中定义的bean更优先。因此,如果测试bean是在Java配置中定义的,那么它就是预期的行为。

要解决此问题,您必须将测试bean放入XML文件并将其放在之后您的prod XML文件中,或者使用{{1}在Java配置中标记您的bean注释。

答案 1 :(得分:1)

问题是我的测试配置类找到了真正的配置类。所以我添加了一个过滤器

@ComponentScan(basePackages = "com.vanguard", excludeFilters = @ComponentScan.Filter(value=Configuration.class, type = FilterType.ANNOTATION))

并从xml中删除了组件扫描,因为它是多余的。现在一切都被加载了一次。