我有一个Carpenter
类,它使用Lathe
和Wood
对象来工作。如何单元测试实例创建?
class Carpenter
{
function Work()
{
$tool = new Lathe();
$material = new Wood();
$tool->Apply($material);
}
}
Lathe
取决于称为Material
在接口上,这样我就可以很容易地进行单元测试Lathe
给它一个假Material
在我的单元测试。 Wood
不依赖于任何东西,所以它也可以很容易地测试。
interface Material {
// Various methods...
}
interface Tool {
function Apply(Material $m);
}
class Wood implements Material {
// Implementations of Material methods
}
class Lathe {
function Apply(Material $m) {
// Do processing
}
}
然而,Carpenter
取决于具体的类Lathe
和Wood
,因为它创建它们的实例。这意味着,就目前而言,我不能单元测试Work()
方法,而不会不经意地将Lathe
和Wood
进行测试。
我应该如何将我的设计更改为单元测试Carpenter
?
有趣。但是,如果你注入一个抽象工厂,是不是只是将单元测试问题转移到创建抽象工厂并将其注入到Carpenter中的方法中?谢谢你的帮助。 – ctford 2009-12-15 09:42:12
不,因为使用抽象工厂将对象创建从行为中分离出来,这意味着您可以对每个对象进行单元测试。 – 2009-12-15 11:43:41
您可以对抽象工厂本身进行单元测试,但创建抽象工厂并将其提供给木匠的方法与原始问题中的问题相同。你必须找出一种方法将测试抽象工厂注入到该方法中(并且我认为抽象工厂工厂不会成为下一步:) ......对吗? – ctford 2009-12-15 13:30:39