GoogleMock - 基于模拟函数变量返回一个值
GoogleMock - Returning a value based on mocked function variables
我正在尝试模拟接受一个结构和 returns 另一个结构的函数。像
struct InParams {
int important_value;
int other_value;
}
struct OutParams {
int same_important_value;
int idk_something;
}
virtual OutParams MyClass::TransformParams(const InParams& params){
...
}
制作模拟函数时,我希望 OutParam 结构依赖于 InParam。所以我做了一个 mocking class 和 function
class MockMyClass : public MyClass {
public:
MOCK_METHOD(OutParams, TransformParams,
(const InParams& params), (const, override));
};
OutParams FakeOutParams(const InParams& in_parm){
return {in_parm.important_value, 1};
}
在期待的通话中我尝试这样使用它
auto fake_wrapper = new MockMyClass();
EXPECT_CALL(*fake_wrapper, TransformParams(_))
.WillRepeatedly(
WithArg<0>(Return(FakeOutParams)));
编译失败。我也尝试过使用 SaveArgPointee,但由于 InParams 不是指针,所以它也不够
我该怎么做才能解决我的问题?
当你使用Return
时,它以returned类型的对象作为参数,通过复制。如果您想变得更通用,并根据某些逻辑更改 return 值,请使用 gmock 操作。例如。 Invoke
这里没问题:
EXPECT_CALL(*fake_wrapper, TransformParams(_))
.WillRepeatedly(Invoke([](const InParams& params) { return FakeOutParams(params); })));
或者直接将逻辑移动到 lambda:
EXPECT_CALL(*fake_wrapper, TransformParams(_))
.WillRepeatedly(Invoke([](const InParams& params) {
return OutParams{ params.important_value, 1 };
})));
我正在尝试模拟接受一个结构和 returns 另一个结构的函数。像
struct InParams {
int important_value;
int other_value;
}
struct OutParams {
int same_important_value;
int idk_something;
}
virtual OutParams MyClass::TransformParams(const InParams& params){
...
}
制作模拟函数时,我希望 OutParam 结构依赖于 InParam。所以我做了一个 mocking class 和 function
class MockMyClass : public MyClass {
public:
MOCK_METHOD(OutParams, TransformParams,
(const InParams& params), (const, override));
};
OutParams FakeOutParams(const InParams& in_parm){
return {in_parm.important_value, 1};
}
在期待的通话中我尝试这样使用它
auto fake_wrapper = new MockMyClass();
EXPECT_CALL(*fake_wrapper, TransformParams(_))
.WillRepeatedly(
WithArg<0>(Return(FakeOutParams)));
编译失败。我也尝试过使用 SaveArgPointee,但由于 InParams 不是指针,所以它也不够
我该怎么做才能解决我的问题?
当你使用Return
时,它以returned类型的对象作为参数,通过复制。如果您想变得更通用,并根据某些逻辑更改 return 值,请使用 gmock 操作。例如。 Invoke
这里没问题:
EXPECT_CALL(*fake_wrapper, TransformParams(_))
.WillRepeatedly(Invoke([](const InParams& params) { return FakeOutParams(params); })));
或者直接将逻辑移动到 lambda:
EXPECT_CALL(*fake_wrapper, TransformParams(_))
.WillRepeatedly(Invoke([](const InParams& params) {
return OutParams{ params.important_value, 1 };
})));