2016-11-24 54 views
1

許多模擬框架具有驗證方法是否被調用的功能。但是大多數框架都要求代碼遵循依賴注入模式。測試:如何驗證一個方法被調用?

我試圖測試的代碼不使用依賴注入模式,因此無法注入對象的模擬。

典例:

public class TestMeClass { 
    public void TransformMe() { } 
} 

public abstract class SomeeClass { 
    public SomeMethod() { 
     CallMeMethod(); 
    } 

    private void CallMeMethod() { 
     TestMeClass testMeClass = new TestMeClass(); 
     testMeClass.TransformMe(); 
    } 
} 

我如何驗證(單元測試)是TransformMe()叫?

它可以使用反射`? (語言是C#)

Jon Skeet我需要你。

+0

這種方法難以測試,因爲在父類本身內正在初始化依賴項。 – Nkosi

+0

這真的不可能。如果你想測試你的SomeeClass Logic的行爲是否應該,你需要以某種方式注入一個TestMeClass的實例,以便你可以監視它的方法。 – axlj

+0

我猜如果你使用'mock'庫,你可以使用'verify'方法。看看[這個](http://stackoverflow.com/questions/9841623/mockito-how-to-verify-method-was-called-on-an-object-created-within-a-method) – esiprogrammer

回答

3

如何驗證(單元測試)是否調用了TransformMe()?

不是。沒有公開可以驗證的東西。

真的很糟糕的例子只是爲了說明問題。

public abstract class SomeeClass{ 
    public SomeMethod(){ 
    CallMeMethod(); 
    } 

    public bool TransformMeCalled {get;private set;} 

    private void CallMeMethod() { 
     TestMeClass testMeClass = new TestMeClass(); 
     testMeClass.TransformMe(); 
     TransformMeCalled = true; 
    } 
} 

可以使用它來reflections`做? (語言是C#)

再次否。依賴關係在依賴類中內部創建,並且對外部參與者未知。外部接入點需要可用,否則這是不可測試的。當你說

,我試圖測試代碼不使用依賴注入模式 ,因此對象的模擬不能注入你回答的問題。

一種選擇是要重構產生依賴性,這將允許它被覆蓋,但是這又是東西,有暴露於外部演員要訪問

public abstract class SomeeClass{ 
    public SomeMethod(){ 
     CallMeMethod(); 
    } 

    public abstract TestMeClass CreateTestMeClass(); 

    private void CallMeMethod() { 
     TestMeClass testMeClass = CreateTestMeClass(); 
     testMeClass.TransformMe(); 
    } 
} 
相關問題