2016-11-24 74 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(); 
    } 
} 
相关问题