2013-07-25 39 views
6

我是一位Spring新手,他正在開發一個基於Spring的大型項目,該項目在Spring bean之間有着廣泛的聯繫。我正在嘗試編寫一些集成測試,以測試整個應用程序功能的子集。爲此,我想重寫一些自動裝配。 例如,假設我有一個類如何覆蓋Spring @Autowire註解並將字段設置爲null?

public class MyDataServiceImpl implements MyDataService { 
    @Qualifier("notNeededForMyDataServiceTest") 
    @Autowired 
    private NotNeededForMyDataServiceTest notNeededForMyDataServiceTest; 
    //... 
} 

,並與上下文文件:

<bean id="myDataService" 
     class="MyDataServiceImpl"> 
</bean> 

在我的測試,我沒有必要使用notNeededForMyDataServiceTest領域。有什麼方法可以覆蓋@Autowired註釋並將notNeededForMyDataServiceTest設置爲空,也許在XML文件中?我不想修改任何Java類,但我確實想避免notNeededForMyDataServiceTest的(有問題的)配置。

我試着這樣做:

<bean id="myDataService" 
     class="MyDataServiceImpl"> 
    <property name="notNeededForMyDataServiceTest"><null/></property> 
</bean> 

這是行不通的。 IntelliJ通知我「無法解析屬性notNeededForMyDataServiceTest'」,顯然是因爲該字段沒有getter和setter。

我使用Spring框架3.1.3。

+0

您是否嘗試過:,我認爲這會給你一個字符串null,但你至少可以設置一個值 – Jayz

回答

5

下面的配置應該工作,我參加了Java配置

@Configuration 
//This will load your beans from whichever xml file you are using 
@ImportResource("classpath:/path/beans.xml") 
public class TestConfigLoader{ 
    // This will declare the unused bean and inject MyDataServiceImpl with null. 
    public @Bean(name="notNeededForMyDataServiceTest") NotNeededForMyDataServiceTest getNotNeededForMyDataServiceTest(){ 
     return null; 
    } 
... any other configuration beans if required. 
} 

混合的自由和註釋您的測試類,像這樣:

// In your test class applicationContext will be loaded from TestConfigLoader 
@ContextConfiguration(classes = {TestConfigLoader.class}) 
public class MyTest { 
    // class body... 
} 
3

這些可以幫助:

和配置文件:

你可以創建一個XML配置不同Bean的定義,然後將它們使用-Dspring.profiles.active="profile1,profile2" ENV激活。

+0

漂亮的鏈接,完全符合要求 – Jayz

+0

感謝三分球!我給安倍獎金,因爲他提供了一個代碼示例。 – kc2001

3

您使用的是@Autowired機制錯了。限定符是而不是您需要設置的屬性。這實際上是一個bean的名稱,這樣容器就可以選擇一個特定的實例,以防在相同的上下文中定義多個相同類型的bean。

因此,容器將尋找類型爲NotNeededForMyDataServiceTest的bean和名稱(實際上它將是XML中的):notNeededForMyDataServiceTest

我想你想要的是指示容器不在該字段中注入任何東西,如果在應用程序上下文中沒有定義類型爲NotNeededForMyDataServiceTest的bean。這可以簡單地通過設置註釋的required屬性來實現false

@Autowired(required = false) 
NotNeededForMyDataServiceTest someOptionalDependency; 

這種方法唯一的缺點是,容器將永遠不會在運行時抱怨,如果沒有什麼在這一領域注入(也許當您的代碼在生產環境中運行時,您會希望進行完整性檢查)。


如果你不想讓這種依賴可選的(或您無法編輯某些原因,代碼),你需要通過設置明確提供該字段的模擬/ null值在你的情況下。一個選擇是使用Java配置而不是XML(比如@ Abe的答案),另一種方法是使用返回null(如this question)的工廠bean。

+0

感謝您的回覆。不幸的是,你是對的 - 我們確實希望在生產中進行理智檢查。 – kc2001

+0

我編輯了我的答案,以提供一些替代方案... –

+0

謝謝!我想分開你的答案和安倍晉三之間的獎金,但我不能。我給安倍獎金,因爲他提供了一個代碼示例。 – kc2001

相關問題