Search code examples
c++googlemock

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


Given the interfaces

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

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

and the goole mock mock

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

what is the easiest way to specify an action which calls Fooable() on the argument to the mocked method Foo()?

I have tried

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

but this doesn't compile because Invoke() with one argument expects a free function, not a member function.

Using boost::bind should probably work, but won't necessarily make the code too readable. Before I write a custom Action, I wanted to check if I'm not missing something totally obvious.


Solution

  • I could not find an easy way and finally settled with

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