模拟对象 - 将所有方法声明为虚拟或使用接口?

时间:2009-03-27 22:47:14

标签: .net unit-testing mocking

在.net中,与Java不同,默认情况下方法不是虚拟的。为了使用大多数模拟对象框架,您必须在“真实”对象上将您想要在模拟上使用的方法标记为虚拟,或者您必须有一个可以模拟被测试的类的接口接受代替实施。

将每个方法标记为虚拟似乎是不好的形式,但为每个类定义一个接口似乎也是不好的形式。

最好的办法是什么?

4 个答案:

答案 0 :(得分:11)

如果我必须在两者之间做出选择,我会选择接口。接口用于定义契约,这基本上是模拟对象将遵循的契约。将方法标记为虚拟可能会产生意想不到的副作用。它会影响被模拟的实际类的设计。接口只定义方法名称,对实际类没有影响。

答案 1 :(得分:10)

我的经验法则是定义接口,如果我希望有多个实现,实际的具体应用程序类或单个应用程序实现以及单元测试的虚假实现。如果我只期望单个实现并且该类不需要伪造(大多数不需要),那么我将根据需要转到虚拟方法路由并重构为接口。

答案 2 :(得分:0)

谁说你的模拟对象必须来自同一个类层次结构?

创建一个具有所需接口并创建该对象实例的简单独立类要容易得多。

您甚至可以创建模拟类的层次结构,并将其用于单元测试。

答案 3 :(得分:-1)

最好的是用你的头。考虑一下你的场景,如果使用虚拟更有意义,那就去做吧。但是,如果界面更适合您的任务,那么就这样做。

所以我真的在添加新功能时将其视为此

  • 继承:使用虚方法。
  • 组成:使用接口。

我确信这有一些警告。所以,只需使用你的头脑,做你方案中最简单的事情。