有人可以解释为什么使用最新版本的Moq和Rhino.Mocks框架的两个测试都失败,抱怨Bar不是虚拟/可覆盖的方法:
public interface IFoo { string Bar(); } public class Foo : IFoo { public string Bar() { return "Bar"; } } [TestMethod] public void MoqTest() { var foo = new Mock(); foo.Setup(f => f.Bar()).Returns("abc"); Assert.AreEqual("abc", foo.Object.Bar()); } [TestMethod] public void RhinoTest() { var foo = new MockRepository().PartialMock (); foo.Expect(f => f.Bar()).Return("abc"); foo.Replay(); Assert.AreEqual("abc", foo.Bar()); }
如果我将Bar方法声明为虚拟,则两个测试都通过.我不明白为什么我必须将Bar声明为虚拟.它不是已经虚拟了吗?它来自界面.
Virtual是类的一部分而不是接口,因此如果您希望覆盖类Foo上的方法,则需要将其声明为虚拟.
然而,正如Krzysztof所提到的,如果你需要的只是接口IFoo上的方法,那么你应该模拟接口.