2017-09-06 89 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的任何呼叫。