2011-08-06 81 views
8

依賴注入幫助你單元測試你的代碼非常好。但是我們如何測試在運行時最終是否注入了正確的依賴關係?例如,我有一個服務類,它包含一個服務驗證器列表。由於驗證器列表是由DI容器注入的,我們如何確保正確的驗證器被注入?如果某些開發人員錯誤地從列表中刪除了驗證程序,該怎麼辦?即使我們在依賴注入中編寫測試,我們也無法在不破壞封裝的情況下斷言所有依賴。唯一的方法是在服務的驗證行爲上進行斷言的集成測試。如果服務行爲複雜,那麼編寫集成測試就變得很困難。有任何想法嗎 ??你如何測試依賴注入?

+2

我認爲集成測試是正確的答案,但你是對的,有些東西可能很難測試。 – Kevin

+2

一些依賴注入框架(如果不是大多數)允許您讓容器驗證所有註冊並測試是否可以創建每個註冊。如果可以,請在應用程序啓動時觸發此驗證。這可以防止在不能創建所有依賴關係時啓動應用程序,這樣您可以在運行(或調試)應用程序時立即找到DI配置錯誤。 – Steven

+0

@Steven hibernate是否有這樣的驗證工具? – mauryat

回答

6

套用你的問題:

我已經測試我的應用程序,它們都工作的各個組成部分,但我怎麼知道應用程序作爲一個整體的作品?

好消息

考慮多麼好的一個位置,你是,相比於在一個位置被問:

現在我已經寫了這些代碼,我怎麼知道應用程序的工作?

您發現並刪除了單元測試中的錯誤。使用依賴注入樣式進行編碼使依賴性清晰並消除對全局變量的依賴。這些技術本身就意味着你會有更少的錯誤,並且特別是當整個應用程序放在一起時只顯示自己的更少的錯誤。

測試更大

現在,移動在回答你的問題,你可以寫一個自動測試斷言特定的驗證是由您的依賴注入容器返回。更重要的是,我喜歡書面方式測試,: -

  • 詢問DI容器對象(其背後就在於合作對象的時候,例如驗證列表)
  • 詢問對象執行它的功能(驗證這個數據)
  • 斷言結果(例如驗證錯誤)

你可能要替換訪問數據庫,當前服務器時間,網絡服務等與測試雙某些對象。這很容易,因爲您正在使用依賴注入。

除非一個類特別麻煩,否則我傾向於在這個級別測試,因爲它允許更多的測試在重構過程中存活。循環複雜度爲1的類如果作爲較大測試的一部分進行操作,則不需要單獨測試。循環複雜度較高的類可能。

很多測試,但它的工作?

即使這樣,你可能會想,但是整件事情是否奏效?

爲了最終回答這個問題,您需要測試應用程序的最終形式。對於Web應用程序,這意味着將其部署在具有適當數據庫和真正防火牆的適當服務器上,然後您可以手動測試或測試諸如Selenium之類的東西。

注入正確依賴關係的失敗會導致注入組件意圖做的任何功能的災難性錯誤。沒有必要測試每個組合,但輕輕觸摸每個組件。