2012-11-28 40 views
0

我有四個類,如以下:模擬測試的依賴注入對象

public class A(){ 

    public void getOne(){ 

    B objB = new B(); 
    String x = objB.getTwo(); 
    } 
} 



public class B(){ 

    public String getTwo(){ 

    C objC = new C(); 
    return objC.getThree(); 
    } 
} 


public class C(){ 

    D objD; 

    public String getThree(){ 

    return objD.getFour(); 
    } 
} 

public class D(){ 

    public String getFour(){ 

    return "hi"; 
    } 
} 

在上面的代碼,類C具有objD正在由彈簧注入。當我嘗試測試類AgetOne()方法時,我得到一個空指針異常,因爲當方法調用到達類C時,它沒有objD實例化(因此是例外)。我如何測試這樣的方法,其中的子子類有一個方法,其中的子子類是由Spring依賴注入的?

回答

1

測試失敗,這是一件好事,因爲Spring沒有辦法將依賴關係注入到它自己不創建的對象中。如果你在做new C(),Spring不知道任何事情,並且在這個C實例中永遠不會注入objD

D應該注入C,注入B,注入B,注入A,這樣可以通過注入模擬B來測試A;可以通過注入一個模擬C測試B,並可以通過注入測試下的模擬D.

0

雖然對象C可以是彈簧注射,你不能在B(因此A),因爲正在使用的實現它new運算符來實例化C,如果沒有其他庫的幫助(我假設你沒有使用它),Spring將不會攔截。

new談到控制反轉是一個骯髒的詞,我在AB都看到它。

理想情況下,當您爲A編寫測試時,您不想依賴它不知道的任何內容(在此例中爲CD)。您可能想要模擬/存根B的實例,並將其注入A。我建議您對B做相同的處理C