这篇文章要求基类方法是虚拟的:question link。
这对我不起作用,因为基类方法不是虚拟的(我没有编写它,也没有源代码)。
如果它们不是虚拟的,我如何模拟并验证基类方法是否被调用?
最新标准 - 我正在Mac上使用Xamarin Studio进行开发。 Moq工作正常,但其他框架如TypeMock或JustMock(Windows安装程序)将无法正常工作。
答案 0 :(得分:3)
这是不可能的。由于Moq的工作方式,Moq没有机会模拟非虚方法。
您是否直接嘲笑班级类型YourClass
,其中YourClass
来自BaseClass
,而BaseClass
是否(public
?)非虚拟非您感兴趣的静态方法?因此,您的模拟类型为Mock<YourClass>
,而不是Mock<IYourClass>
,其中IYourClass
是一个接口?
您是否必须使用BaseClass
作为基类,而不是“编写”(类BaseClass
的字段在您的类中)?
答案 1 :(得分:1)
如上所述,Moq只能模拟虚拟方法。
一个可能的最终运行是将您的un moqable类包装在代理中,并在代码中使用此代理。
public class MyUnMoqableClass {
public string GetValue() {
return "Hello World";
}
}
public interface IMyUnMoqableClassProxy {
string GetValue();
}
public class UnMoqableClassProxy : IMyUnMoqableClassProxy {
private readonly MyUnMoqableClass _myUnMoqableClass;
public UnMoqableClassProxy(MyUnMoqableClass myUnMoqableClass) {
_myUnMoqableClass = myUnMoqableClass;
}
public string GetValue() {
return _myUnMoqableClass.GetValue();
}
}
如果你在unmoqable类上有一个大的接口,但确实让一个人隔离了客户端代码,那可能有点(很多)乏味。