![](/img/trans.png)
[英]google mock - how to say “function must be called ONCE with a certain parameter but ok to be called many times with different parameters”?
[英]Google mock invoke function with parameters
static bool helper(int a){
// do something here
return true;
}
class ProxyMock : public Proxy
{
public:
MOCK_METHOD1(functionA, bool(
int a
));
};
TEST(xxx, xxx){
ProxyMock mock;
int a;
EXPECT_CALL(mock, functionA(5)).WillOnce(testing::Invoke(helper(a));
}
当使用参数(5)调用模拟对象的函数A时,我想调用一个静态全局函数helper
,它接受我想要的参数。 编译时出现错误: 'function' cannot be used as a function
EXPECT_CALL
行中的函数。 怎么了?
Invoke
需要一个仿函数。 Functor 是可以调用的东西(使用operator()
),例如函数指针、具有重载operator()
的结构或 lambda。
此外,它需要仿函数匹配关于参数类型和返回类型的模拟函数(您的helper
符合该标准),并且它将始终将模拟函数接收到的参数传递给该仿函数(您不想要)。
如果要调用具有不同参数的函数,最简单的方法是使用InvokeWithoutArgs
和 lambda:
EXPECT_CALL(mock, functionA(5)).WillOnce(
testing::InvokeWithoutArgs(
[a](){return helper(a);}
)
);
您可以直接将一个零参数的可调用对象传递a
WillOnce
。 最简单的方法是使用 lambda:
EXPECT_CALL(mock, functionA(5))
.WillOnce([a]() { return helper(a); });
请注意, Invoke
传递的参数与传递给被测函数的参数相同。 因此,仅当您想将5
传递给helper
时才应使用它:
EXPECT_CALL(mock, functionA(5))
.WillOnce(testing::Invoke(helper)); // helper(5) will be called.
作为替代方案,您可以使用InvokeWithoutArgs
,它的作用类似于Invoke
但不会将任何参数传递给作为其参数的可调用对象,但是您应该再次使用 lambda 捕获之类的东西来访问a
,因此没有必要。
现场示例: https ://godbolt.org/z/vqdxT86E4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.