是否可以使用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)。

10-01 23:34