3

不需要虚拟化您想要模拟的所有属性访问器,这会破坏模拟的目的吗?

我的意思是,如果我必须修改我的对象并虚拟化我想模拟的每一个访问器,我难道不能继承我的类并自己模拟它吗?

4

1 回答 1

3

您的问题非常有效,但如果您考虑一下,没有其他方法可以模拟课程。如果您采用接口,它只是一个合同,因此模拟框架可以模拟您想要的任何方式,但如果您采用一个类,它已经为它的成员提供了一个实现。

因此,为了能够模拟类成员,模拟框架必须从类继承并根据请求覆盖成员的行为,为此,只有虚拟成员才能工作。

例如。如果你有(我正在展示方法,但属性也是如此)

class Foo
{
    public void Bar()
    {

    }
    public virtual void  virtualBar()
    {

    }
}

那么模拟框架可能会创建类似这样的东西来模拟

public class MockFoo : Foo
{
    public override void virtualBar()
    {
        // mockery action
    }

    public new void Bar()
    {
        // mockery action
    }
}

现在当你有

Foo foo = GetMockObject(); // you get an instance of MockFoo

现在当你打电话时

foo.Bar();

你不打算让它调用实际的实现,但由于它是一个非虚拟成员,它会Foo调用Bar()

另一方面,调用

foo.VirtualBar();

会调用MockFoo's VirtualBar(),因为它是一个虚拟成员,它会根据要求由模拟框架注入行为。

于 2011-05-04T02:00:14.760 回答