2010-05-16 117 views
8

小背景:如何覆蓋Spring的行爲@Autowired

我使用Spring 2.5,特別是Spring IOC和註解。

我在我的代碼中使用@Autowired(自動裝配按類型完成) 並使用@Component將類暴露給自動接線。

下面描述的情況出現時,我試圖測試我的代碼。

現在的問題:

注:我使用的測試環境不同的彈簧語境。

我有一個類FOO@Autowired但在測試方面,我想使用不同的類的相同類型的MockFoo(延伸FOO)。

由於FOO類的依賴關係注入(FOOMockFOO符合類型檢查)的多個選項,彈簧設置當然會自動失敗。

我正在尋找一種方法來注入測試bean,而不是原始的bean。

我期待Spring允許使用Context配置文件來重寫bean注入或者讓Spring不自動裝載特定的bean。

所有這些選擇似乎僅適用於最初在Spring上下文配置文件中定義的豆存在。

回答

6

使用ReflectionTestUtils手動設置到位的自動裝配Autowired依賴素(爲目的進行管理你的模擬不能用彈簧,所以沒有歧義存在)

+0

這是當你沒有注入到多個類相同的實例很好地解決 - 但在一個大的項目,其中一類行爲作爲一個服務提供者(這是一個單身人士),並注入到許多類,我希望有一些更容易/更好的解決方案,以避免注入使用原始的每個類 – Mark 2010-05-19 15:52:15

2

我知道這個問題是很老但我認爲答案可能對其他人有用。

由於您可能不想在您的上下文中混用Foo和MockFoo,我會建議從組件掃描中去除Foo。這可以通過例如在<context:component-scan>上指定include/exclude filters來完成。

但是,如果你正在實現單元測試,我寧願建議不要使用Spring上下文,而是通過手動注入依賴項的模型實現「純粹」單元測試,以便你只測試一個類。這可以通過使用模擬框架(如Mockito)更容易地實現。

2

我同意迪迪埃。下面是一個如何排除您想要在測試應用程序上下文中進行模擬的實現的示例。

<context:component-scan base-package="com.company" > 
    <context:exclude-filter type="regex" expression="com\.abc\.service\.XDaoImpl"/>  
</context:component-scan> 

包括在測試這個應用程序上下文如下:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:/applicationContext-test.xml"}) 
public class MyTest {....} 
+0

好的答案,我真的會去與這一個。不要忘記,您可以在要注入bean的bean上使用@Qualifier(name =「someBean」),並在要注入特定bean實例的字段上使用@Resource(name =「someBean」)。 – 2011-09-23 17:02:53