在.net中,与Java不同,默认情况下方法不是虚拟的.为了使用大多数模拟对象框架,您必须在"真实"对象上将您想要在模拟上使用的方法标记为虚拟,或者您必须有一个可以模拟被测试的类的接口接受代替实施.
将每个方法标记为虚拟似乎是不好的形式,但是为每个类定义一个接口似乎也是不好的形式.
什么是最好的事情?
如果我必须在两者之间做出选择,我会选择接口.接口用于定义契约,这基本上是模拟对象将遵循的契约.将方法标记为虚拟可能会产生意想不到的副作用.它会影响被模拟的实际类的设计.接口只定义方法名称,对实际类没有影响.
我的经验法则是定义接口,如果我希望有多个实现,实际的具体应用程序类或单个应用程序实现和单元测试的虚假实现.如果我只期望单个实现并且该类不需要伪造(大多数不需要),那么我将根据需要转到虚拟方法路由并重构为接口.