我有一個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