2012-05-31 88 views
3

我想配置某些類(FactoryProviders)在單元測試中使用時的行爲不同。運行單元測試時讀取不同屬性集合的正確方法

public class ConnectionFactoryProvider { 

    public static IConnectionFactory getConnectionFactory() { 
     //return MockConnectionFactory if running in test mode and 
     //DefaultConnectionFactory is running in production mode 
    } 

} 

我需要返回取決於代碼是否在測試模式(單元測試)或生產模式下運行的不同的ConnectionFactory。

什麼是實現這一目標的正確途徑?想到一些可能的解決方案......但是它們中的任何一個都是廣泛遵循的習慣用語?

  • 通過JVM參數指定系統屬性,使得在生產和測試模式下運行時該值會有所不同。
  • 在屬性文件中保留工廠的完全限定名稱,並確保在測試模式下運行時文件系統上有不同的屬性文件。這對於Maven來說很容易實現,因爲我們可以在測試階段運行時控制類路徑順序,但我不確定在Eclipse中運行單元測試時是否可以實現。
  • 配置在測試中設置方法的ConnectionFactoryProvider所以它返回MockConnectionFactory
+0

你有沒有考慮使用[嘲諷框架(HTTP ://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java)? – assylias

+0

assylias是對的。嘲笑框架將會非常有幫助。 –

+0

[另一個有趣的帖子](http:// stackoverflow。com/questions/1419713/mocking-vs-faking-when-to-use-what) – assylias

回答

5

依賴注入(DI)。你的ConnnectionFactories是依賴關係。 DI將允許您發送一個ConnectionFactory的實例作爲構造函數參數。通過這種方式,單元測試會發送一個MockConnectionFactory實例,實時代碼將發送到一個DefaultConnectionFactory實例中。

public class ConnectionFactoryProvider { 
    public static IConnectionFactory getConnectionFactory(IConnectionFactory connectionFactory) { 
    //use the connectionFactory 
    } 
} 

//unit test 
ConnectionFactoryProvider cfp = new ConnectionFactoryProvider(aMockConnectionFactoryInstance); 

//live code 
ConnectionFactoryProvider cfp = new ConnectionFactoryProvider(aDefaultConnectionFactoryInstance); 

希望有所幫助。

P.S.我是C#開發人員,但我認爲Java中的語法對你來說或多或少是相同的。

+0

你會使ConnectionFactoryProvider成爲單例嗎? – Parag

+0

你絕對可以做到這一點。或不。這將在ConnectionFactoryProvider的實現中處理;但是,它不會影響使用DI的決定。 –

+0

是的,我同意,如果我正確理解你的意思,你說ConnectionFactoryProvider本身可以配置並且DI'd – Parag

1

我使用以下兩種方法在我的代碼的應用程序:

  1. 閱讀,可能包含符號名稱的系統屬性。在生產中,使用默認值。符號名稱映射到一個配置文件,解釋名稱的含義。

    這樣,您可以擁有任意數量的配置文件,您可以在運行時添加配置(無需更改代碼即可在生產中啓用更多日誌記錄以追蹤錯誤)。

    示例:系統屬性的名稱是db.config。符號名稱爲h2,it,prod(默認)。配置文件在${configPath}/db-${db.config}.xml

  2. 根據屬性user.name讀取配置。這使您可以輕鬆地爲每個開發人員提供自己的配置。如果沒有與該名稱的配置文件,缺省配置讀取(或默認總是被讀出,然後用一個可選的每用戶配置合併)

+0

非常有趣的想法。我特別發現使用user.name的想法非常有趣。不知何故,我不習慣使用它,因爲它似乎在軟件中添加了很多移動部分,並使其變得有點脆弱。但它仍然充滿了有趣的可能性。 – Parag

相關問題