2017-09-06 129 views
1

以下是我的代碼設計。我需要指導,如何爲它編寫測試用例。在java中嘲弄受保護方法的對象

abstract class X 
{ 
    public void xyz() 
    { 
     A a = getA(); 
     callMe(a); 
    } 
    private A getA() 
    { 
      //do some stuff 
      return a; 
    } 
    protected void callMe(); 
} 

下面是子類:

class Y extends X 
{ 
    @Autowired 
    MyClass myClass; 

    protected void callMe(A a) 
    { 
     B b = provideB(); 
     C c = b.getC(); 
     c.setValue(myClass.getSomeValue()); 
    } 
    private B provideB() 
    { 
     //every child class has its own way of providing this object 
     return b; 
    }  
} 

現在,我寫單元測試用例子類Y,所以我要求測試方法XYZ。我知道我需要嘲笑MyClass對象,因爲它是我的外部依賴項。所以我嘲笑它。但我很困惑,如果我嘲笑A,因此後來B和C,或者隨後在受保護/私有方法中以某種方式創建它,我應該讓它的創建在測試時發生嗎? 任何鉛將不勝感激。

回答

1

我個人只測試一個類的公共接口。所以我只會打電話xyz()並檢查它是否尊重其合同。由於A,B和C沒有被注入,所以它們不是公共接口的一部分,我不會嘲笑它們。

現在你應該注射還是不注射。這取決於A,B和C的對象類型。如果他們很小,愚蠢的對象(例如值對象),那麼你會很好地在私人/受保護的方法中創建它們。如果它們的尺寸稍大一點,特別是如果你可以想像有一天想使用它們的不同實現,那麼你應該注入它們並嘲笑它們。如果您希望X類控制這些對象的使用期限,則可以注入一個Factory來代替,並用撥打工廠電話來替換new的任何呼叫。