google mock - 怎么说“函数必须用某个参数调用ONCE,但可以用不同的参数多次调用”?

时间:2017-05-29 19:25:37

标签: c++ unit-testing googletest googlemock

我需要检测一个给定的函数是否已经使用一组参数完全调用ONCE。

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

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

我该如何表达?

2 个答案:

答案 0 :(得分:1)

在谷歌模拟中,后来的期望超越了之前的期望(docs中的更多细节),所以你可以这样写:

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

答案 1 :(得分:1)

执行like VladLosev said。将默认情况(最常见的情况是,因为它允许使用带有_字符的 any 参数)设置为“ ,将更具体的情况为之后,如果它们首先匹配,则覆盖默认情况。

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

[确切的报价开始]


使用多个期望{#MultiExpectations}

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

默认情况下,当调用模拟方法时,gMock将在 定义了它们的倒序,并在积极期望 匹配找到的参数(您可以将其视为“新规则覆盖 如果您的匹配期望不能再接听电话,您将 违反上限。这是一个示例:

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

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

注意:为什么gMock会按 reverse 顺序搜索匹配项, 期望?原因是这允许用户设置默认值 对模拟对象的构造函数或测试夹具的设置阶段的期望 然后通过在测试中编写更具体的期望来自定义模拟 身体。因此,如果您对同一方法有两个期望,则需要将 一个具有更具体的匹配项,之后;另一个,或更具体的规则 随之而来的是更普遍的一种。

提示:从对方法的全面期望开始是很常见的 和Times(AnyNumber())(忽略参数,或者对所有参数使用_ 超载)。这使得对方法的任何调用都可以预期。没必要 对于根本没有提到的方法(这些是“无趣的”),但是 对于具有某些期望但又需要其他调用的方法很有用 好。看到 了解无趣与意外通话。


[确切的报价结束]

相关:

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