模拟比存根更好吗?

2024-06-19

不久前我读到了模拟不是存根 http://www.martinfowler.com/articles/mocksArentStubs.htmlMartin Fowler 的文章,我必须承认我有点害怕外部依赖性增加的复杂性,所以我想问:

单元测试时最好使用什么方法?

始终使用模拟框架来自动模拟正在测试的方法的依赖关系是否更好,或者您更喜欢使用更简单的机制(例如测试存根)?


正如口头禅所说:“用最简单、可行的方法。”

  1. 如果假课程可以完成工作,那就跟着他们吧。
  2. 如果您需要模拟具有多个方法的接口,请使用模拟框架。

避免使用模拟always因为它们使测试变得脆弱。您的测试现在对实现调用的方法有了复杂的了解,如果模拟的接口或您的实现发生变化……您的测试就会失败。这很糟糕,因为您将花费额外的时间来运行测试,而不仅仅是让 SUT 运行。测试不应与实现过于密切。
所以请运用你最好的判断力.. 我更喜欢模拟,因为它可以帮助我节省用 n>>3 方法编写更新假类的时间。

Update尾声/审议:
(感谢 Toran Billups 提供的模拟测试示例。见下文)
嗨,Doug,我认为我们已经进入了另一场圣战 - 经典 TDD 者 vs Mockist TDD 者。我想我属于前者。

  • 如果我在 test#101 Test_ExportProductList 上,我发现我需要向 IProductService.GetProducts() 添加一个新参数。我这样做让这个测试绿色。我使用重构工具来更新所有其他引用。现在我发现所有调用该成员的模拟测试现在都崩溃了。然后我必须回去更新所有这些测试——浪费时间。为什么 ShouldPopulateProductsListOnViewLoadWhenPostBackIsFalse 失败?是因为代码被破坏了吗?相反,测试被破坏了。我赞成一次测试失败 = 1 个需要修复的地方。嘲笑频率与此相反。存根会更好吗?如果是的话,我有一个 fake_class.GetProducts() .. 当然可以更改一个地方,而不是通过多个 Expect 调用进行霰弹手术。最后,这是一个风格问题.. 如果您有一个通用的实用方法 MockHelper.SetupExpectForGetProducts() - 那也足够了.. 但您会发现这是不常见的。
  • 如果在测试名称上放置白色条带,则测试将难以阅读。模拟框架的大量管道代码隐藏了正在执行的实际测试。
  • 要求您学习模拟框架的这种特殊风格
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟比存根更好吗? 的相关文章

  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 如何测试无状态组件

    我正在尝试测试下面的组件 但出现错误 它是一个带有一些数据的功能组件 下面的组件从父组件接收信息列表并渲染 它工作完美 但是在编写测 试用例时 它使用笑话和酶失败 import React from react export const I
  • 模拟测试方法

    尝试模拟在另一个方法中调用的方法 code part public virtual bool hello string name int age string lastName GetLastName public virtual stri
  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • 在使用 SQL 查询的单元测试中模拟 IDocumentQuery

    我正在使用单元测试来测试DocumentDBRepository班级 我跟着这个帖子 https stackoverflow com questions 49906029 mocking idocumentquery in unit tes
  • 错误:没有 @Attribute('sampleString') 的提供者

    我们正在尝试为使用第三方 java 脚本库的组件编写单元测试 我们组件的构造函数看起来像 Constructor Inject ElementRef private eleref ElementRef Attribute sampleStr
  • 单元测试 SqlFunction

    我有一个公开 IQueryable 的存储库和一个处理特定查询的服务 这里有一些使用 DbFunctions 的方法 为了可测试 我创建了一个带有静态元素列表的假存储库并将其注入到服务中 问题是 由于我的服务查询列表并且不使用数据库 因此我
  • 如何将 DateTime 设置为 ValuesAttribute 进行单元测试?

    我想做这样的事情 Test public void Test Values new DateTime 2010 12 01 new DateTime 2010 12 03 DateTime from Values new DateTime
  • 如果单元测试如此出色,为什么没有更多的公司这样做呢? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 RhinoMock 或 Moq 测试方法的内部结构

    我对这个嘲笑的事情很陌生 我有几个问题 如我错了请纠正我 模拟不会初始化真正的方法 即模拟不会实际调用类的构造函数 相反 它会执行类似查看类的签名并创建具有该签名但没有任何方法功能的对象的操作 如果您只需要该类型的对象但不想测试它的内部结构
  • 如何在C中模拟套接字

    我有一个使用套接字的函数 我会模拟它 但我找不到如何做到这一点 有没有办法在 C 中模拟套接字 Thanks 大多数系统 库函数是弱符号 https en wikipedia org wiki Weak symbol 这意味着您可以创建自己
  • 如何在控制器中模拟 Automapper (IMapper)

    我正在尝试为现有的 MVC Web 应用程序编写单元测试 我在自动映射器中面临一些问题 IMapper 每当使用地图函数时它都会返回null value 我的控制器代码 public class UserAdministrationCont
  • 如何对我的 asp.net-mvc 控制器的 OnActionExecuting 方法进行单元测试?

    我已经重写了控制器的 OnActionExecuting 方法 以根据执行的 filterContext 设置一些内部状态 我该如何测试这个 该方法本身是受保护的 所以我假设我必须在调用堆栈中走得更高 我需要什么代码来测试这个 我正在使用
  • 尝试在 Android Studio 上运行单元测试时出现 NoClassDefFoundError

    我正在尝试为我的 Android 应用程序创建一些简单的测试 但在运行测试时遇到了问题 当我尝试运行测试时 我不断收到 NoClassDefFound 错误 但我似乎无法弄清楚其原因是什么 如果我能有一双新的眼睛来看待这个问题 我将不胜感激
  • Jest/Typescript:Jest 和 Typescript 中的模拟类依赖项

    我有依赖于类 A 的类 B 我想测试类 B 的方法 该方法在内部调用类 A 的方法 现在 我想通过模拟类 A 对类 B 的方法进行单元测试 我的代码结构 class A getSomething return Something class
  • 预期在模拟中调用一次,但使用 Moq 时调用次数为 0 次

    我收到错误 在mock上调用一次 但是0次 下面是我的代码结构 public class GenerateAddress IGenerateAddress public GenerateAddress IAddress createAdd
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock

随机推荐