Ваш вопрос очень актуален, но если подумать, другого способа издеваться над классом нет.Если вы берете интерфейс, это просто контракт, так что макет фреймворка может издеваться как угодно, но если вы берете класс, у него уже есть реализация для его членов.
Таким образом, макет фреймворка, чтобы иметь возможность имитировать членов класса, должен наследовать от класса и переопределять поведение члена в соответствии с запросом, и для этой цели будут работать только виртуальные члены.
Например.если у вас есть (я показываю методы, но то же самое относится и к свойствам)
class Foo
{
public void Bar()
{
}
public virtual void virtualBar()
{
}
}
, тогда mock Framework, вероятно, создает что-то подобное для mock
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
's Bar()
с другой стороны, вызов
foo.VirtualBar();
вызовет MockFoo
'VirtualBar()
, так как это виртуальный член, поведение которого будет введено фиктивной структуройв соответствии с просьбой.