[英]How to unit test instance creation?
我有一個Carpenter
類,使用Lathe
和Wood
對象完成它的工作。
class Carpenter
{
function Work()
{
$tool = new Lathe();
$material = new Wood();
$tool->Apply($material);
}
}
Lathe
依賴於一個名為Material
的接口,所以我可以通過在我的單元測試中給它一個假Material
來輕松地對Lathe
進行單元測試。 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
對象使用中分離對象創建。
class Carpenter
{
function getTool() {
return new Lathe();
}
function getMaterial() {
return new Wood();
}
function Work()
{
$tool = getTool();
$material = getMaterial();
$tool->Apply($material);
}
}
這樣,您可以覆蓋TestCarpenter
類中的getTool()
和getMaterial()
方法,並注入您自己的Material
和Tool
假貨。
getTool()
和getMaterial()
方法也可以單獨進行單元測試。
Michael Feathers會將getTool()
和getMaterial()
方法getMaterial()
“接縫”,因為它們是可以在不更改周圍代碼的情況下插入偽造的點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.