操作参考

操作指定模拟函数被调用时应该做什么。此页面列出了 GoogleTest 提供的内置操作。所有操作都在 ::testing 命名空间中定义。

返回值

操作 描述
Return() void 模拟函数返回。
Return(value) 返回 value。如果 value 的类型与模拟函数的返回类型不同,则在设置 expectation 时value 转换为后一种类型,而不是在执行操作时转换。
ReturnArg<N>() 返回第 N 个(从 0 开始)参数。
ReturnNew<T>(a1, ..., ak) 返回 new T(a1, ..., ak);每次创建一个不同的对象。
ReturnNull() 返回空指针。
ReturnPointee(ptr) 返回 ptr 指向的值。
ReturnRef(variable) 返回对 variable 的引用。
ReturnRefOfCopy(value) 返回对 value 副本的引用;该副本的生命周期与操作相同。
ReturnRoundRobin({a1, ..., ak}) 每次调用将返回列表中的下一个 ai,到达列表末尾时从头开始。

副作用

操作 描述
Assign(&variable, value) value 赋值给 variable。
DeleteArg<N>() 删除第 N 个(从 0 开始)参数,它必须是指针。
SaveArg<N>(pointer) 通过复制赋值将第 N 个(从 0 开始)参数保存到 *pointer
SaveArgByMove<N>(pointer) 通过移动赋值将第 N 个(从 0 开始)参数保存到 *pointer
SaveArgPointee<N>(pointer) 将第 N 个(从 0 开始)参数指向的值保存到 *pointer
SetArgReferee<N>(value) value 赋值给第 N 个(从 0 开始)参数引用的变量。
SetArgPointee<N>(value) value 赋值给第 N 个(从 0 开始)参数指向的变量。
SetArgumentPointee<N>(value) SetArgPointee<N>(value) 相同。已弃用。将在 v1.7.0 中删除。
SetArrayArgument<N>(first, last) 将源范围 [first, last) 中的元素复制到第 N 个(从 0 开始)参数指向的数组,该参数可以是指针或迭代器。该操作不拥有源范围中元素的所有权。
SetErrnoAndReturn(error, value) errno 设置为 error 并返回 value
Throw(exception) 抛出给定的异常,它可以是任何可复制的值。自 v1.1.0 起可用。

使用函数、仿函数或 Lambda 作为操作

在下文中,“可调用”指的是自由函数、std::function、仿函数或 lambda。

操作 描述
f 使用传递给模拟函数的参数调用 f,其中 f 是一个可调用对象。
Invoke(f) 使用传递给模拟函数的参数调用 f,其中 f 可以是全局/静态函数或仿函数。
Invoke(object_pointer, &class::method) 使用传递给模拟函数的参数调用对象上的方法。
InvokeWithoutArgs(f) 调用 f,它可以是全局/静态函数或仿函数。f 必须不带参数。
InvokeWithoutArgs(object_pointer, &class::method) 调用对象上的方法,该方法不带参数。
InvokeArgument<N>(arg1, arg2, ..., argk) 调用模拟函数的第 N 个(从 0 开始)参数,它必须是一个函数或仿函数,带有 k 个参数。

被调用函数的返回值用作操作的返回值。

在定义要与 Invoke*() 一起使用的可调用对象时,可以将任何未使用的参数声明为 Unused

using ::testing::Invoke;
double Distance(Unused, double x, double y) { return sqrt(x*x + y*y); }
...
EXPECT_CALL(mock, Foo("Hi", _, _)).WillOnce(Invoke(Distance));

Invoke(callback)InvokeWithoutArgs(callback) 拥有 callback 的所有权,它必须是永久的。callback 的类型必须是基本回调类型而不是派生类型,例如:

  BlockingClosure* done = new BlockingClosure;
  ... Invoke(done) ...;  // This won't compile!

  Closure* done2 = new BlockingClosure;
  ... Invoke(done2) ...;  // This works.

InvokeArgument<N>(...) 中,如果需要通过引用传递参数,请将其包装在 std::ref() 中。例如,

using ::testing::InvokeArgument;
...
InvokeArgument<2>(5, string("Hi"), std::ref(foo))

调用模拟函数的第 2 个参数,并通过值将 5string("Hi") 传递给它,并通过引用传递 foo

默认操作

操作 描述
DoDefault() 执行默认操作(由 ON_CALL() 或内置操作指定)。

注意:由于技术原因,DoDefault() 不能在复合操作中使用 - 尝试这样做会导致运行时错误。

复合操作

操作 描述
DoAll(a1, a2, ..., an) 执行所有操作 a1an,并在每次调用中返回 an 的结果。前 n - 1 个子操作必须返回 void,并将接收参数的只读视图。
IgnoreResult(a) 执行操作 a 并忽略其结果。a 不能返回 void。
WithArg<N>(a) 将模拟函数的第 N 个(从 0 开始)参数传递给操作 a 并执行它。
WithArgs<N1, N2, ..., Nk>(a) 将模拟函数的选定(从 0 开始)参数传递给操作 a 并执行它。
WithoutArgs(a) 执行没有任何参数的操作 a

定义操作

描述
ACTION(Sum) { return arg0 + arg1; } 定义一个操作 Sum() 以返回模拟函数的参数 #0 和 #1 的总和。
ACTION_P(Plus, n) { return arg0 + n; } 定义一个操作 Plus(n) 以返回模拟函数的参数 #0 和 n 的总和。
ACTION_Pk(Foo, p1, ..., pk) { statements; } 定义一个参数化操作 Foo(p1, ..., pk) 来执行给定的 statements

ACTION* 宏不能在函数或类内部使用。