我们可以在单元测试中使用多个模拟对象吗?

问题描述 投票:0回答:4

我读过很多关于单元测试的文章。 大多数文章都说我们不应该在测试中使用多个模拟对象,但我不明白为什么。 有时,我们在测试中确实需要多个模拟对象。

class unit-testing user-interface private public
4个回答
6
投票

根据上下文,您可以在单元测试中拥有多个模拟。

但是我认为“文章”可能暗示的是

  • 防止过度嘲笑。当单元测试模拟出所有协作者时,你就敞开大门;当您替换真正的协作者时,该场景可能会失败。通过最大限度地减少模拟数量并尽可能使用真正的合作者,您可以最大限度地降低风险。
  • 高耦合警报:如果您发现自己必须模拟大量协作者才能编写单元测试,则可能是一种设计味道,表明您具有高耦合。

3
投票

您应该根据需要添加尽可能多的模拟来隔离您的测试类。您需要为每个不应成为测试一部分的依赖项进行模拟。

有时,为了简单起见,您在测试中将两个或三个类放在一起,因为它们构建了类似组件的东西并且高度耦合。其他一切都应该被嘲笑。

我知道这种“最佳实践”只有一个模拟,但也不理解它。在我们的单元测试中,我们有很多模拟,一些环境模拟是由我编写的测试框架设置的(例如TransactionService,SecurityService,SessionService)。只有一件事需要考虑,正如 Gishu 在他的回答中已经提到的那样,许多模拟表明高度依赖。太多的时候就由你自己考虑了。我们有很多小接口,在测试中需要很多mock。

要扭转你的答案,你应该在以下情况下模拟依赖关系:

  • 它是被测类的高度耦合部分,如内部类、私有类等。
  • 它是一个常见的.NET框架类,如Collection之类
  • 您想要编写一个集成测试来准确测试与该类的交互。 (您仍然模拟其他所有内容,并且仍然对每个涉及的类进行单独的单元测试。)
  • 模拟某个类的成本太高了。谨慎决定它太昂贵,模拟似乎很难设置,但与使用真实类时遇到的可维护性问题相比,这是一件轻而易举的事。但有些框架和技术并不是针对接口实现的,并且很难模拟。如果将此框架类放在您自己的界面后面成本太高,您需要在测试中接受它们。

3
投票

我不确定您指的是哪些文章,但我通常为被测类的每个依赖项都有一个模拟对象。


0
投票

我们正在向遗留代码添加测试,通常有 10 到 15 个模拟用于 20 到 25 行测试。 我自己认为这些测试是有价值的,而不是毫无价值的,但每个测试都有自己的价值。

© www.soinside.com 2019 - 2024. All rights reserved.