在java中模拟受保护方法的对象

时间:2017-09-06 11:32:24

标签: java mockito protected

以下是我的代码设计。我需要指导,如何为它编写测试用例。

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 个答案:

答案 0 :(得分:1)

我个人只测试一个类的公共接口。所以我只会打电话给xyz()并检查它是否尊重合同。由于A,B和C没有被注入,所以它们不是公共接口的一部分,我不会嘲笑它们。

现在关于你是否应该注射它们。这取决于对象A,B和C的类型。如果它们是小的,愚蠢的对象(例如值对象),那么您可以在私有/受保护的方法中创建它们。如果它们是一些更大的对象,特别是如果你可以想象有一天想要使用它们的不同实现,那么你应该注入它们并模拟它们。如果您希望X类控制这些对象的生命周期,您可以注入Factory,并用调用工厂替换对new的任何调用。