2016-03-20 181 views
1

我最近開始學習Spring和依賴注入的概念。我對Junit測試和Mocking概念有一些瞭解,但仍然無法圍繞依賴注入提供的特定測試相關優勢進行打包。依賴注入的測試優勢

比如我實例類三角方式如下: -

Triangle triangle1 = new Triangle(); 

和現在使用Spring依賴注入,我做了以下方式

Triangle triangle2 = (Triangle) beanFactory.getBean("triangle"); 

說出Triangle類有一些方法那需要測試。測試中有什麼不同的方法triangle1triangle2

+1

使用構造函數注入而不是場注入。然後,你仍然可以在單元測試中使用'new',爲依賴項提供模擬。 – chrylis

+0

即使您打算使用'getBean'(1.使用構造函數注入,2.自動裝入您的測試類),請使用通用簽名。 – chrylis

回答

1

有了Spring,你不會明確地從工廠查找bean。相反,容器在使用它們之前初始化這些bean,所以你的代碼不必調用容器本身。

在Web應用程序中,通常會有Web控制器處理將Web請求和帖子轉換爲對業務邏輯的調用,事務處理實現業務邏輯的服務以及每個執行簡單查詢或更新的方法的數據訪問對象。 (所有這些通常都是無狀態的,唯一的實例成員是對其他無狀態對象的引用,並且它們可以同時執行多個請求。)每個層中的對象都依賴於下一層中的對象,並且Spring在啓動時將所有這些對象連接在一起。

如果我有一個使用服務的控制器,Spring會創建控制器和服務並將服務連接到控制器。應用程序代碼永遠不會調用bean工廠。

public class SomeWebController { 
    private MyBusinessLogicService myBusinessLogicService; 

    public SomeWebController(MyBusinessLogicService myBusinessLogicService) { 
     this.myBusinessLogicService = myBusinessLogicService; 
    } 
    ... 
} 

單元測試不必知道容器。測試可以通過插入mock來獲取測試對象,通過創建這些依賴關係並直接調用setter方法,或者通過創建一個測試配置並在mock中插入這個插件來設置它的依賴關係。

如果我有一個不使用Spring的控制器,並且它直接使用它的構造函數實例化服務,那麼替換模擬服務就很困難。我將不得不像重構那樣爲服務引入一個工廠方法,並在測試中重寫它以返回一個模擬。這將在測試中引入樣板代碼,我必須將我正在測試的類進行子類化,並且在覆蓋的工廠方法未執行的情況下,我的覆蓋範圍中存在空白。

+0

感謝您的回覆。所以,當我在我原來的帖子中測試第二個案例時,我會寫如下內容: 'Triangle tester = Mockito.mock(Triangle.class);' 不能爲我的第一種情況寫同樣的東西嗎?對容器的不可知性如何使我處於有利的狀況? – user3559089

+0

@ user3559089;一個更充實的例子會有所幫助。 Spring是爲了將事物連接在一起而設計的,當你只有一個對象時,很難看出問題是什麼。 –

+0

你能給我一個充實的例子嗎?我不知道你在想什麼樣的例子......謝謝! – user3559089