2017-06-14 111 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中刪除了組件掃描,因爲它是多餘的。現在一切都被加載一次。