在 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
的任何调用替换为对工厂的调用。
下面是我的代码设计。我需要指导,如何为它编写测试用例。
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
的任何调用替换为对工厂的调用。