不需要虚拟化您想要模拟的所有属性访问器,这会破坏模拟的目的吗?
我的意思是,如果我必须修改我的对象并虚拟化我想模拟的每一个访问器,我难道不能继承我的类并自己模拟它吗?
不需要虚拟化您想要模拟的所有属性访问器,这会破坏模拟的目的吗?
我的意思是,如果我必须修改我的对象并虚拟化我想模拟的每一个访问器,我难道不能继承我的类并自己模拟它吗?
您的问题非常有效,但如果您考虑一下,没有其他方法可以模拟课程。如果您采用接口,它只是一个合同,因此模拟框架可以模拟您想要的任何方式,但如果您采用一个类,它已经为它的成员提供了一个实现。
因此,为了能够模拟类成员,模拟框架必须从类继承并根据请求覆盖成员的行为,为此,只有虚拟成员才能工作。
例如。如果你有(我正在展示方法,但属性也是如此)
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()
,因为它是一个虚拟成员,它会根据要求由模拟框架注入行为。