在 java 中模拟 objects 受保护的方法

Mocking objects of protected methods in java

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

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

下面是child class:

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;
    }      
}

现在,我正在为child class Y编写单元测试用例,所以我调用xyz方法进行测试。我知道我需要模拟 MyClass object 因为它是我的外部依赖项。所以我嘲笑它。但是我很困惑,我应该模拟 A 并因此随后模拟 B 和 C,或者因为它们随后以某种方式在 protected/private 方法中创建,所以我应该让它的创建在测试时发生吗? 任何线索将不胜感激。

我个人只测试了class的public接口。所以我只会打电话给 xyz() 并检查它是否遵守合同。由于 A、B 和 C 未注入,因此它们不是 public 接口的一部分,我不会嘲笑它们。

现在关于你是否应该注射它们。这取决于对象 A、B 和 C 是什么类型。如果它们是小而笨的对象(例如值对象),那么您可以在 private/protected 方法中创建它们。如果它们是稍微大一点的对象,尤其是如果你可以想象有一天你想要使用它们的不同实现,那么你应该注入它们并模拟它们。如果您希望 X class 控制这些对象的生命周期,您可以注入工厂,并将对 new 的任何调用替换为对工厂的调用。