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

有帮助吗?

解决方案

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

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

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

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

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

其他提示

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

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

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

我不知道你指的是什么样的文章,但我通常每一个依赖模仿对象被测类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top