对传递给模拟函数的参数调用成员函数的最简单方法是什么?

What is the easiest way to invoke a member function on an argument passed to a mocked function?

本文关键字:函数 最简单 成员 方法 是什么 调用 参数 模拟      更新时间:2023-10-16

给定接口

class IFooable {
  virtual void Fooable() = 0;
};
class IFoo {
  virtual void Foo(IFooable* pFooable) = 0;
};

和google mock

class TMockFoo : public IFoo {
  MOCK_METHOD1(Foo, void (IFooable*));
};

指定在模拟方法Foo()的参数上调用Fooable()的操作的最简单方法是什么?

我试过了

TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WithArg<0>(Invoke(&IFooable::Fooable));

,但这不能编译,因为Invoke()带一个参数需要一个自由函数,而不是成员函数。

使用boost::bind应该可以工作,但不一定会使代码太易读。在我编写自定义Action之前,我想检查一下我是否遗漏了一些非常明显的东西。

我不能测试它,因为我没有安装Google Mock,但似乎Invoke有另一个重载两个参数,对象和方法指针,所以它将是:

IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));

我找不到一个简单的方法,最后决定使用

TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
  .WillByDefault(Invoke(boost::mem_fn(&IFooable::Fooable)));

调用成员函数最简单的方法是使用lambda:

   TMockFoo MockFoo;
   ON_CALL(MockFoo, Foo(_))
      .WithArg<0>(Invoke([](IFooable * pFooable) { pFooable->Fooable(); }));