我有一个Carpenter
类,它的工作使用Lathe
and a Wood
object.
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
and Wood
因为它必须创建它们的实例。这意味着就目前而言,我无法对Work()
方法不经意间带来Lathe
and Wood
正在测试中。
我应该如何将我的设计更改为单元测试Carpenter
?
您可以在这里采取几个不同的方向:
- Use 构造函数注入并简单地将工具和材料实例注入木匠中。
- 如果由于某种原因注入实例不起作用(可能是因为您需要为 Work 方法的每次调用创建新实例),您可以注入抽象工厂反而。
- 您还可以使用工厂方法ctford 描述的方法,但这要求您还创建特定于测试的覆盖以便能够进行单元测试,虽然这是完全有效的事情,但它只是更多的工作,并且在许多情况下其他替代方案更好、更灵活。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)