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 };
})));