【发布时间】:2020-05-23 15:49:15
【问题描述】:
我已经用 gmock 从一个对象中模拟了一个函数。现在我想要的是,每次调用这个函数时,它都会调用对象 A 的函数,并将 Param 作为参数传递。 下面你可以找到一个sn-p的代码
//class I want to call
class A {
public:
void func1(const Param& p) {cout<<p.name_<<endl;};
}
class Param {
public:
string name_;
}
class IMock {
public:
virtual void func2(int x) = 0;
}
class Mock : public IMock{
public:
MOCK_METHOD(void, func2, (int x), (override));
}
测试:
A a;
Param param;
Mock mock;
EXPECT_CALL(mock, func2(_))
.WillOnce(
testing::WithArg<param>(testing::Invoke(&a, a.func1)));
但我有以下编译错误:
param 的值在常量表达式中不可用
无效使用非静态成员函数 virtual void A::func1(const Param&)
有什么想法吗?
编辑 1
在@pptaszni 响应之后,新的测试代码是:
TEST(Test_case, test_flow) {
A a;
Param param;
Mock mock;
ON_CALL(mock, func2(_)).WillDefault(testing::Invoke(
[&a, ¶m]() { a.func1(param); })));
mock.func2(23);
}
但是现在编译器说:
调用 testing::internal::OnCallSpec::WillByDefault(std::decay >::type) 没有匹配的函数 [&a, & 参数]() { a.func1(param); })); 注意:候选: testing::internal::OnCallSpec& testing::internal::OnCallSpec::WillByDefault(const testing::Action&) [with F = void(int)] OnCallSpec& WillByDefault(const Action& action) { ^~~~~~~~~~~~~ 注意:没有已知的参数 1 从“std::decay >::type {aka Test_case_test_flow::TestBody()::}”到“const testing::Action&”的转换
我正在使用 GitHub (1.10) 上提供的最新版本的 googletet
【问题讨论】:
-
仔细看看我的回答:“lambda 表达式一定是你的
Mock::func2的签名”。在您的情况下,缺少int参数。正确:[&a, &param](int)
标签: c++ googletest googlemock