这里有更多信息。做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()) (省略参数,或使用 _ 表示所有参数,如果
超载)。这会对预期的方法进行任何调用。这不是必需的
对于根本没有提到的方法(这些是“无趣的”),但是
对于有一些期望但有其他调用的方法很有用
好的。看
了解无趣与意外调用。
相关:
- google mock - can I call EXPECT_CALL multiple times on same mock object?