不需要虚拟化你想要模拟的所有属性访问器有点挫败嘲弄的目的吗?
我的意思是,如果我必须修改我的对象并虚拟化我想要模拟的每一个访问者,我不能继承我的课并自己模拟它吗?
答案 0 :(得分: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
的{{1}}
另一方面,打电话
Bar()
会调用foo.VirtualBar();
的{{1}},因为它是一个虚拟成员,它会根据请求由模拟框架注入行为。