【问题标题】:google mock - how to say "function must be called ONCE with a certain parameter but ok to be called many times with different parameters"?google mock - 怎么说“函数必须使用某个参数调用一次,但可以使用不同的参数多次调用”?
【发布时间】:2017-10-30 03:56:42
【问题描述】:

我需要检测给定的函数是否已使用一组参数准确地调用过一次。

EXPECT_CALL(Mock_Obj, func("abc")).Times(1)

但可以使用不同的参数多次调用该函数。

我该如何表达?

【问题讨论】:

标签: c++ unit-testing googletest gmock googlemock


【解决方案1】:

这里有更多信息。做like VladLosev said。将默认情况(最通用,因为它允许带有_ 字符的 any 参数)情况 first 和更具体的情况 after 覆盖如果它们首先匹配,则为默认情况。我说后者 EXPECT_CALL()s 可能匹配 first 因为 gmock 会 reverse 搜索匹配项,这意味着它会尝试匹配 last @ 987654326@ first,然后它向上移动,在它为调用找到的 first 匹配处停止并退出此过程,以相反的顺序。

EXPECT_CALL(Mock_Obj, func(_)).Times(AnyNumber());
EXPECT_CALL(Mock_Obj, func("abc")).Times(1);
EXPECT_CALL(Mock_Obj, func("def")).Times(1);
EXPECT_CALL(Mock_Obj, func("cab")).Times(1);
EXPECT_CALL(Mock_Obj, func("bac")).Times(1);

来自"gMock for Dummies {#GMockForDummies}" guide

使用多个期望{#MultiExpectations}

到目前为止,我们只展示了您有单一期望的示例。更多的 实际上,您将指定对多个模拟方法的期望,这些方法可能是 来自多个模拟对象。

默认情况下,当一个 mock 方法被调用时,gMock 会在 reverse order 它们被定义,并在一个积极的期望时停止 找到匹配的参数(您可以将其视为“较新的规则覆盖 较旧的。”)。如果匹配的期望不能再接听任何电话,您将 获得违反上限的失败。这是一个例子:

using ::testing::_;
...
EXPECT_CALL(turtle, Forward(_));  // #1
EXPECT_CALL(turtle, Forward(10))  // #2
    .Times(2);

如果Forward(10)连续被调用3次,第三次将是 错误,因为最后一个匹配期望(#2)已经饱和。然而,如果, 第三个Forward(10)调用替换为Forward(20),就可以了, 因为现在 #1 将是匹配的期望。

注意: 为什么 gMock 会以 reverse 的顺序搜索匹配项 期望?原因是这允许用户设置默认值 模拟对象的构造函数或测试夹具的设置阶段的期望 然后通过在测试中编写更具体的期望来定制模拟 身体。所以,如果你对同一个方法有两个期望,你想把 一个具有更具体的匹配器另一个,或更具体的规则 会被后面的更一般的阴影所掩盖。

提示:从对方法的全面期望开始是很常见的 和 Times(AnyNumber()) (省略参数,或使用 _ 表示所有参数,如果 超载)。这会对预期的方法进行任何调用。这不是必需的 对于根本没有提到的方法(这些是“无趣的”),但是 对于有一些期望但有其他调用的方法很有用 好的。看 了解无趣与意外调用。

相关:

  1. google mock - can I call EXPECT_CALL multiple times on same mock object?

【讨论】:

    【解决方案2】:

    在 Google Mock 中,以后的期望会覆盖之前的期望(更多详细信息请参见 docs),因此您可以这样写:

    EXPECT_CALL(Mock_Obj, func(_)).Times(AnyNumber());
    EXPECT_CALL(Mock_Obj, func("abc")).Times(1);
    

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2017-01-19
      • 2016-04-18
      • 1970-01-01
      • 2014-02-05
      • 2023-03-15
      相关资源
      最近更新 更多