我遇到了一个问题,我为我的源代码创建了一个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。
答案 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中删除了组件扫描,因为它是多余的。现在一切都被加载了一次。