我需要检测一个给定的函数是否已经使用一组参数完全调用ONCE。
EXPECT_CALL(Mock_Obj, func("abc")).Times(1)
但是可以用不同的参数多次调用该函数。
我该如何表达?
答案 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:
[确切的报价开始]
到目前为止,我们仅显示了您有一个期望的示例。更多 实际上,您将对多种模拟方法指定期望值,这些方法可能是 来自多个模拟对象。
默认情况下,当调用模拟方法时,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())
(忽略参数,或者对所有参数使用_
超载)。这使得对方法的任何调用都可以预期。没必要
对于根本没有提到的方法(这些是“无趣的”),但是
对于具有某些期望但又需要其他调用的方法很有用
好。看到
了解无趣与意外通话。
[确切的报价结束]