是否可以使用Moq模拟实现接口(interface)和抽象类的对象?
IE。:
public class MyClass: SomeAbstractClass, IMyClass
你可以 mock 吗?
最佳答案
您可以模拟任何接口(interface),以及任何抽象或虚拟成员。基本上就是这样。
这意味着绝对有可能做到以下几点:
var imock = new Mock<IMyClass>();
var aMock = new Mock<SomeAbstractClass>();
如果未密封从SomeAbstractClass继承的成员,则还可以模拟MyClass:
var mcMock = new Mock<MyClass>();
这是否有意义取决于MyClass的实现。假设SomeAbstractClass的定义如下:
public abstract class SomeAbstractClass
{
public abstract string GetStuff();
}
如果MyClass中的GetStuff方法是这样实现的,您仍然可以覆盖它:
public override string GetStuff()
{
return "Foo";
}
这将使您可以编写:
mcMock.Setup(x => x.GetStuff()).Returns("Bar");
因为除非明确密封,否则GetStuff仍然是虚拟的。但是,您是否像这样编写了GetStuff:
public override sealed string GetStuff()
{
return "Baz";
}
您将无法 mock 它。在这种情况下,您会从Moq中获得一个异常,指出它是对非虚拟成员的无效替代(因为它现在是
sealed
)。