2017-06-14 137 views
0

我遇到了一个问题,我为我的源代码创建了配置类,并为我的测试包创建了单独的配置类。我想要一些在测试中创建的bean比在其他环境中创建的不同。然而,当我运行构建这里发生了什么:(我有一个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。

回答

1

问题是,由于某种原因,XML中定义的任何bean都比Java配置中定义的bean具有更高的优先级。所以如果你测试bean是在Java配置中定义的,那么它就是预期的行为。

为了解决它,你必须要么把你的测试豆成XML文件,并把它放在@ImportResource你督促XML文件或标记您的豆Java配置与@Primary注解。

+0

被覆盖的bean没有在xml中定义,只在我的其他@Configuration类中定义。是否有可能我的xml找到了我的其他配置,因为组件扫描,并且*是*是什么导致覆盖? – Steve

+0

@Steve是可能的,但请更具体一些:您的产品类位于何处,它被实例化为bean,您的测试类位于何处以及它作为bean实例化的位置? –

1

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

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

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