簡體   English   中英

如何覆蓋Spring @Autowired的行為

[英]How to override the behavior of Spring @Autowired

一點背景:

我正在使用Spring 2.5,特別是Spring IOC和注釋。

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

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

現在來問題:

注意:我為Test環境使用不同的Spring Context。

我有一個類FOO ,它是@Autowired但在測試環境中我想使用相同類型的另一個類MockFoo (擴展FOO )。

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

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

我希望Spring允許使用Context配置文件來覆蓋bean注入或命令Spring不要自動裝配特定的bean。

所有這些選項似乎只存在於最初在Spring Context Configuration文件中定義的bean。

使用ReflectionTestUtils手動設置Mock代替自動連接的依賴項(為此目的,您的模擬不能是彈簧管理的,因此不存在歧義)

我知道這個問題已經很老了,但我認為答案可能對其他人有用。

由於你可能不希望在你的上下文中混合使用Foo和MockFoo,我建議從組件掃描中刪除Foo。 這可以通過在<context:component-scan>上指定包含/排除過濾器來完成。

但是,如果您正在實現單元測試,我寧願建議不要使用Spring上下文,只是通過手動注入依賴項的模型來實現“純”單元測試,這樣您只測試單個類。 使用像Mockito這樣的模擬框架可以更容易地實現這一點

我同意迪迪埃的觀點。 下面是一個示例,說明如何在測試應用程序上下文中排除要模擬的實現。

<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 {....}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM