Google Mock:使用全局模拟对象可以吗?

2024-01-10

在所有有关的文档中gmock我总是发现模拟对象在测试中被实例化,如下所示:

TEST(Bim, Bam)
{
    MyMockClass myMockObj;
    EXPECT_CALL(MyMockObj, foo(_));
    ...
}

因此,每次测试都会创建和销毁该对象。我相信创建和销毁每个对象也是完全可以的测试治具。但我想知道是否也可以拥有模拟对象的文件全局实例,如下所示:

MyMockClass myMockObj;

TEST(Bim, Bam)
{
    EXPECT_CALL(MyMockObj, foo(_))
    ...
}

我尝试过,到目前为止我绝对没有任何问题,一切似乎都工作正常。但也许我应该知道什么?只是因为我偶然发现这个问题 https://stackoverflow.com/questions/28475881/google-mock-global-mock-object-memory-leak,其中唯一的答案是:

...问题是您正在实例化 FooMock 的全局实例。 Googlemock/googletest 希望模拟在测试主体中或在测试夹具类中定义。

但我在文档或其他任何地方都找不到任何可以证实这一点的内容(我是否忽略了它?)。

谢谢,格奥尔格

PS:我需要使用全局模拟实例的原因将是另一个讨论的主题(请参阅这个帖子 https://stackoverflow.com/a/32274666/5226287我的)。


你可以,但这不是一个好主意。

这样做是违反隔离原则的UT。 此违规可能会导致测试意外失败/通过。

Gtest使用假对象的析构函数来验证期望是否发生,这就是每个假对象将在测试主体或测试装置类中创建和释放的期望背后的原因。

如果您将假对象设置为全局,那么它不会在每个对象结束时释放UT,那么验证就不会执行,即使应该失败,测试也会通过。更多关于你的一些UT当您一起执行所有测试时,可能会失败/失败;在一次测试中您期望该方法x不会调用,而在另一种情况下,您希望该方法会调用;在一个 UT 中,您预计方法 x 将调用 3 次,但该方法在测试中被调用两次 + 在其他测试中被调用一次(测试应该失败,但不会......)

因此,最重要的是,您永远不应该使用全局模拟,除非该全局模拟仅用于防止空指针(您没有设置行为..)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Mock:使用全局模拟对象可以吗? 的相关文章

随机推荐

  • 如何使用 OpenXML SDK 将 Excel 转换为 CSV?

    我需要将 Excel 2010 文件转换为 csv 目前我正在使用 Excel Interop 打开并另存为 csv 效果很好 然而 Interop 在我们使用它的环境中存在一些问题 所以我正在寻找另一个解决方案 我发现在没有互操作的情况下
  • 仅合并 R 中不同数据帧中的一列或两列

    我有两组数据框 下面是每行的前五行 First Data frame Name sampel sort name id supplier usage ABC 10000079 811121 1 DEF 10000182 541513 4 S
  • 难以捕获执行就地状态更新的子流程的输出

    所以我试图将 HandBrakeCLI 的输出捕获为 Python 子进程 这对于 stderr 来说不是问题 因为每次更新都会在类似文件的管道中创建一个新行 但是 使用标准输出 HandBrakeCLI 会进行就地更新 但我很难捕获它们
  • 如何在查询字符串中使用回车或换行?

    客户可以在文本区域中输入行 并将其保存在数据库中 如果客户返回站点 他可以加载之前输入的数据 但是 换行符和回车符不会显示在文本区域中 我可以将它们放在查询字符串中 例如通过 ASCII 编码 A 或 D 但 java 不喜欢这样并抛出 I
  • Swift 中块参数的文档标记格式是什么?

    如果您添加文档标记 则 Swift 中块的参数会显示该块的参数表 但我不知道如何填写该表 我已经在Xcode 标记参考格式 https developer apple com library ios documentation Xcode
  • 更改 Mac Catalyst 上 UITextField 或 UITextView 的提示颜色

    如何以编程方式更改 mac Catalyst 上 UITextField 提示的颜色 提示存在 但颜色与 UITextField 相同 提示在 iOS 上显示正确的颜色 我尝试失败 tintColor 代码 iOS 和 Mac Cataly
  • firebase的app token在什么时期发生变化以及如何管理?

    我是 firebase 的新手 我就像一个小孩学走路一样学习它 到目前为止 我已经成功使用 firebase 框架为我的手机生成的令牌向我自己的手机发送消息 现在这就是棘手的地方 在我看来 有一种方法叫做onTokenRefresh in
  • AWS Dynamo 不会自动缩小规模

    Here are the parameters I have set on the table And here is what I see for the capacity over time 为什么它仍保持在 25 个写入单元 难道不应
  • 将对象转换为类似类型

    在斯卡拉 我有两个 Any 类型的对象 如果可能的话 我想将对象转换为正确的 Ordered 特征 然后将它们与 你可以通过以下方式实现Ordering类型类别 def compare T Ordering Manifest a AnyRe
  • 如何使用 FireDAC 在 Firebird 3.0 上启用 WireCompression [重复]

    这个问题在这里已经有答案了 我希望使用 WireCompression 连接到 Firebird Server 3 0 这是自 3 0 版以来的新功能 我很难做到这一点 我能找到的唯一记录说明是在 firebird conf 中将 Wire
  • Firefox 扩展中的 IP 地址查找

    我正在编写一个 Firefox 扩展 我需要找到当前加载页面的 IP 地址 我可以使用 window location host 获取页面的主机名 但是有什么方法可以找到该主机名的 ip 吗 我尝试在 Mozilla 开发人员中心寻找答案
  • 使用 mod_wsgi 在 Apache 上部署多个 django 应用程序

    我想在同一主机中部署两个不同的 django 应用程序 第一个对应于 url site1 第二个对应于 url site2 这是我的配置 LoadModule wsgi module modules mod wsgi so WSGIScri
  • 如何编写 a-> b -> b -> b 类型的函数来折叠树

    一些背景 我在Haskell中有一个以下类型的foldT函数 类似于foldr 但用于树 foldT a gt b gt b gt b gt b gt Tree a gt b 该foldT仅将类型 a gt b gt b gt b 作为输入
  • Overflow-x:hidden 仍然可以滚动

    问题是 我有一个全宽的栏菜单 它是通过在右侧和左侧创建一个大边距来制作的 该边距应裁剪为overflow x hidden 而且它是 没有滚动条 一切 视觉上 都很好 但是 如果您拖动页面 使用 Mac Lion 或向右滚动 页面会显示一个
  • Bootstrap模式:关闭当前,打开新的

    我已经寻找了一段时间 但找不到解决方案 我想要以下内容 在 Bootstrap 模式中打开 URL 我当然有这个工作 所以内容是动态加载的 当用户按下此模式内的按钮时 我希望当前的模式隐藏 之后立即 我希望使用新的 URL 用户单击的 打开
  • 如何获取chrome当前版本的当前URL

    我想获取 chrome 当前版本的当前 URL 所以 我尝试使用这种方式 http www codeproject com Questions 648906 how to get current URL for chrome ver 29
  • + 不支持的操作数类型:“float”和“datetime.timedelta”,“出现在索引 5”)

    我有一个数据集 其中一个输入包含日期和时间 首先 我编写了代码来查找 X3 列中 5 值的第一个时间 然后将该时间转换为 0 然后我尝试将 timedelta hours 1 添加到范围为 6 的内容中 然后它给了我这个错误 unsuppo
  • 如何将错误 403 重定向到 .htaccess 中的 root

    我对 Apache 不是很坚定 所以如果这个问题看起来有点明显 请原谅 我想通过 htaccess 文件将特定目录中导致错误 403 的请求重定向到我的网络服务器根目录 所以https thedomain com secretlair ht
  • 分配器和工作线程端点队列在同一台机器上

    我正在使用 NServiceBus 3 2 2 0 尝试在同一台机器上测试分配器和工作人员 我注意到经销商正在创建以下队列 端点队列 EndPointQueue distributor control EndPointQueue distr
  • Google Mock:使用全局模拟对象可以吗?

    在所有有关的文档中gmock我总是发现模拟对象在测试中被实例化 如下所示 TEST Bim Bam MyMockClass myMockObj EXPECT CALL MyMockObj foo 因此 每次测试都会创建和销毁该对象 我相信创