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

时间:2011-08-23 11:52:00

标签: c++ gmock

给出接口

class IFooable {
  virtual void Fooable() = 0;
};

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

和goole mock mock

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

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

我试过了

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

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

使用boost::bind应该可行,但不一定会使代码过于可读。在我编写自定义Action之前,我想检查一下我是否错过了一些非常明显的东西。

3 个答案:

答案 0 :(得分:1)

我找不到一个简单的方法,最后以

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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