以下是我的代码设计。我需要指导,如何为它编写测试用例。
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以及随后在受保护/私有方法中以某种方式创建它们,所以,我应该在测试时让它的创建发生吗? 任何领导将不胜感激。
答案 0 :(得分:1)
我个人只测试一个类的公共接口。所以我只会打电话给xyz()
并检查它是否尊重合同。由于A,B和C没有被注入,所以它们不是公共接口的一部分,我不会嘲笑它们。
现在关于你是否应该注射它们。这取决于对象A,B和C的类型。如果它们是小的,愚蠢的对象(例如值对象),那么您可以在私有/受保护的方法中创建它们。如果它们是一些更大的对象,特别是如果你可以想象有一天想要使用它们的不同实现,那么你应该注入它们并模拟它们。如果您希望X类控制这些对象的生命周期,您可以注入Factory,并用调用工厂替换对new
的任何调用。