问题
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.
回答1:
I could not find an easy way and finally settled with
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
.WillByDefault(Invoke(boost::mem_fn(&IFooable::Fooable)));
回答2:
I cannot test it as I don't have Google Mock installed, but it seems Invoke
has another overload with two parameters, the object and the method pointer, so it would be:
IFooable* ifooable = new IFooableImpl(...);
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
.WithArg<0>(Invoke(&ifooable,&IFooable::Fooable));
回答3:
The easiest way to invoke a member function is to use a lambda:
TMockFoo MockFoo;
ON_CALL(MockFoo, Foo(_))
.WithArg<0>(Invoke([](IFooable * pFooable) { pFooable->Fooable(); }));
来源:https://stackoverflow.com/questions/7160600/what-is-the-easiest-way-to-invoke-a-member-function-on-an-argument-passed-to-a-m