操作参考
操作指定模拟函数被调用时应该做什么。此页面列出了 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 个参数,并通过值将 5
和 string("Hi")
传递给它,并通过引用传递 foo
。
默认操作
操作 | 描述 |
---|---|
DoDefault() |
执行默认操作(由 ON_CALL() 或内置操作指定)。 |
注意:由于技术原因,DoDefault()
不能在复合操作中使用 - 尝试这样做会导致运行时错误。
复合操作
操作 | 描述 |
---|---|
DoAll(a1, a2, ..., an) |
执行所有操作 a1 到 an ,并在每次调用中返回 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*
宏不能在函数或类内部使用。