为什么我的单元测试需要一个模拟框架?

时间:2008-11-18 21:19:58

标签: unit-testing mocking

最近围绕.NET世界中所有不同的模拟框架进行了大量宣传。我还没有完全掌握它们的优点。编写我自己需要的模拟对象似乎并不难。特别是在Visual Studio的帮助下,我可以快速编写一个实现我想要模拟的接口的类(它为我自动生成几乎所有内容),然后为我的测试编写一个实现方法。完成!为什么要经历一个理解模拟框架的麻烦,其唯一目的是保存几行代码。或者是一个模拟框架,不仅仅是关于保存代码行?

10 个答案:

答案 0 :(得分:32)

一旦我终于掌握了模拟对象,我意识到它们对于单元测试至关重要,原因与双盲测试或对照组对于科学试验至关重要:它们会隔离您实际测试的内容。

如果您正在测试一个通过其他接口进行相当多交互的类,那么您不仅可以在必须模拟每个接口时保存代码行,而且还可以执行“throw”之类的操作。如果意外的方法被称为“或”异常,如果这些方法被无序调用,则会出现异常“。你可以通过模拟框架获得非常复杂的功能,虽然我很快就会承认它有一个很大的学习曲线,当你加快速度时它们会帮助你让你的单元测试更加彻底而不会臃肿。

答案 1 :(得分:12)

您确实在您的问题中确定了模拟框架的关键点之一。您自己编写模拟代码的事实不是开发人员应该关注的事情。模拟框架以编程方式为您提供接口的实现,并且它们是可用的(基于您的模拟设置)。

例如,如果您正在测试ICustomerDAO,您会怎么做?并且您想要测试一些方法14次,每种方法有不同的结果?手动实现14个不同的类?我怀疑有人会想那样做。

当你不关心它们是否真的有效时,Mocks可以让你有能力定义你的类的部分会发生什么,比如在你想要的时候抛出异常,返回零结果并确保你处理正确等等...

它们是一款出色的单元测试工具。

答案 2 :(得分:8)

以前的问题可能有所帮助:
What is a mock and when should you use it?
Mockist vs classical TDD

我发现使用模拟框架可以让我更快地生成测试,并且可以更好地验证我期望在测试中发生的实际情况。我过去曾经实施过存根或假货。我发现我需要生成特定于我想要的测试的存根,这需要花费很多时间。我可以使用模拟框架更快地创建相同的测试。好的支持使用简单的语法生成假货,存根或模拟。

需要一段时间才能掌握它,我暂时避免使用它,但现在不会因为@Chamelaeon所说的原因而没有模拟框架。

答案 3 :(得分:4)

Roy Osherove有一个关于模拟框架的评论,在评论部分中有一个关于是否需要模拟框架的讨论(尽管简短)。

我个人已按照您的说法手动完成,并且运作良好,但这主要是出于习惯,而不是对模拟框架的一般认可。

答案 4 :(得分:3)

嗯,我当然不认为你需要一个嘲弄的框架。这是一个与其他框架一样的框架,它最终旨在为您节省一些时间和精力。您还可以执行诸如堆栈和队列之类的自己的常见数据结构之类的操作,但是通常使用您所选语言的编译器/ IDE附带的类库中内置的数据通常更容易吗?

我确信使用模拟框架还有其他令人信服的理由,不过我会把它留给TDD和单元测试专家来回答。

答案 5 :(得分:2)

出于同样的原因,如果没有NUnit,你不会尝试编写单元测试。模拟框架将帮助您验证数百个单元测试的状态和行为。值得花2周左右的时间来加快速度,真正帮助你专注于需要测试的东西。

答案 6 :(得分:2)

让我对模拟框架感到困扰的一件事就是“通过

给出i / p的功能应该是什么?

when(mock.someMethod(“some arg”))。thenReturn(“something”);

语句分布在许多单元测试类中。

让我举一个例子。假设有一个DAO接口函数getEmp(int EmpID),它在传递Employee ID作为参数时返回一个Employee Object。假设这个函数被10个不同的单元测试类所嘲笑。现在,如果将来更改此函数以返回更新版本的Employee对象,则必须转到10个不同类中的每个类来更新此更改。

缺点如下......

a)我不知道如何弄清楚所有模拟这个函数的类,以便我可以更新这个更改。

b)我现有的使用模拟DAO对象的测试用例仍然没有意识到DAO接口发生的变化,因为模拟没有改变,因此继续变为绿色。 理想情况下,如果我自己编写了一个模拟类并在任何地方使用它,那么我只需要一个地方来更新较新版本的Employee对象。此外,一旦我在这一个地方更新,我使用模拟的所有现有测试用例都会中断,然后我会知道我需要去哪些地方并为新的Employee对象做更新。

对我的观点有任何想法......

答案 7 :(得分:0)

模拟框架的一个好处是它允许设置对被模拟对象的期望。根据期望,我可以设置各种条件来运行正在测试的代码。

答案 8 :(得分:0)

隔离框架或mocking framework允许您测试所需的代码,而不依赖于它。它可用于短期运行测试,允许您快速调试,并轻松构建围绕代码的测试安全网。不同的框架具有不同的功能,如前所述 - 它是一个工具,您应该为工作选择合适的工具。

答案 9 :(得分:0)

我使用rhino mocks作为模拟框架。我和其他5位开发人员在一个为期8个月的大型企业应用程序中使用它。我们在项目中使用了tdd。它值得吗?我猜。使用模拟是否有如此巨大的卖点,我必须在每个项目中使用它?在我看来,没有。它不是必需的东西,它只是一个你可以使用的工具,如果你想尝试它。有些项目你可以推出你自己的模拟类,因为这里有人说他们更喜欢 - 它更容易。其他项目规模较大,可能需要一个模拟框架。关键词(在我看来)可能需要......您需要多少代码覆盖率?对我来说,这是使用模拟的另一个考虑因素。我用tdd / rhino mocks做的项目我们需要有80%的代码覆盖率,所以模拟帮助我们实现了这一目标。如果我们的代码覆盖率要求较低,例如40%,我们可能不会使用模拟框架,只是编写我们自己的模拟类,就像其他人提到的那样。