为什么我们需要像Easymock,JMock或Mockito这样的模拟框架?

时间:2010-05-04 12:09:31

标签: unit-testing tdd mocking easymock stubs

5 个答案:

答案 0 :(得分:14)

简单的答案是我们需要它们。

我们也不需要其他现有框架,但使用Mocking框架可以让我们的生活更加轻松。作为开发人员,我们可以将更多时间花在手头的问题上,而不是创建或执行模拟框架可以做的事情。

  

我没有找到令人信服的理由   切换到Mocking框架   手写的存根。“

我完全一样。我为什么要费心学习模拟框架?手写的存根很好。

有几点可以想到,主要是因为一段时间后你的测试变得模糊不清。使用手写存根时所指的内容称为测试扩展。您可以扩展代码以启用模拟框架。换句话说,您将代码写入存根,或根据发生的情况返回值。这需要时间和精力。更不用说空间了。一个模拟框架可以在一条线上完成所有这些。

模拟框架的好处是:

  • 更容易(主观,但过了一段时间你就不会写手写的实现
  • Less Code(框架允许您在行中创建模拟,而不是完整的类声明
  • 关注DRY(你最终不会重复模拟实现

当您需要模拟对象时,最大的好处就来了。必须手写代码来检查方法是否被调用,多少次等等本身就是一个迷你任务。如果其他人已经这样做,并创建了一个经过充分测试,记录良好的框架,那么不使用它就没有意义。就像任何框架一样,没有它就可以顺利进行,但有时使用正确的工具可以使工作变得更加轻松。

答案 1 :(得分:9)

答案 2 :(得分:2)

我以相同的方式开始(手工编写模拟),到现在我几乎完全切换到EasyMock。

我发现使用EasyMock通常更快,更灵活。

通常我第一次需要一个模拟器,我可以用EasyMock的几行代码来实现它,而我需要实现所需的接口(公平地说,这可以通过像IntelliJ这样的IDE生成)然后添加必要的代码以产生所需的响应和/或允许感知调用对它的影响。

很好,有人可能会说,这只是一次性费用。下次我可以快乐地重复使用手写的模拟......我发现通常情况并非如此。在另一个测试中,我可能需要模拟具有不同行为的同一个类。例如。调用不同的方法,和/或预期不同的结果。一个特定的情况是,假设模拟在一个测试用例中抛出异常,而在另一个测试用例中抛出异常。好吧,我可以添加一些参数来动态控制行为。然后,对于下一个测试,一些更多的参数来控制更多的行为...所以我最终得到一个更复杂的模拟实现,这是一个依赖于更多的单元测试 - 也冒着无意中破坏旧测试的风险。

与此相反,使用EasyMock,我可以为每个测试独立配置我的模拟。因此,行为在单元测试代码本身内被明确控制和可见,并且没有副作用的风险。

更不用说使用EasyMock,您可以验证是否需要以所需顺序调用所需的方法(如果需要,我会这样做)。手工实施(特别是以通用方式)将是非常痛苦的,因为没有额外的好处。

答案 3 :(得分:2)

就像其他开发人员一样,我发现自己编写代码而不是使用现有的解决方案 - “这里没有发明”的综合症。

您的问题表明您更喜欢编写假冒/模拟两次所需的类,而不是使用可以为您执行此操作的框架。使用模拟框架可以使您无需在更改伪造对象时编写,重构和更新手动模拟。

换句话说,使用模拟框架就像任何其他第三方库一样,例如ORM - 其他人编写了代码,因此您不必这样做。

答案 4 :(得分:1)

有时以声明方式创建模拟可能更容易,它可以帮助您使用框架而不是手工编写更容易的行为。另一个小优势也可能是通过使用模拟框架,您明确了解模拟。