zeejan
zeejan

Reputation: 285

How to use gmock to mock up a std::function?

The constructor of my class is

A( ...
   std::function<bool(const std::string&, const std::string&)> aCallBack, 
   ... );

I want to use EXPECT_CALL to test it. This callback is from another class B. I created a Mock like

class BMock : public B
{
    MOCK_METHOD2( aCallBack, bool(const std::string&, const std::string&) );
}

Then I tried

B *b = new B();
std::function<bool(const std::string&, const std::string&)> func = 
    std::bind(&B::aCallBack, b, std::PlaceHolders::_1, std::PlaceHolders::_2);

It still does not work. How can I get a function pointer of a gmock object?

Thanks!!

Upvotes: 11

Views: 14487

Answers (2)

Md Enzam Hossain
Md Enzam Hossain

Reputation: 1326

If you want to use mock to keep track of calls and set return values, you can use MockFunction.

using testing::_;
using testing::MockFunction;
using testing::Return;

MockFunction<bool(const std::string&, const std::string&)> mockCallback;

EXPECT_CALL(mockCallback, Call(_, _)).WillOnce(Return(false)); // Or anything else you want to do

A( ...
   mockCallback.AsStdFunction()
   ...);

Upvotes: 34

Paolo Vigori
Paolo Vigori

Reputation: 1714

With unit testing you should only test your class A so your test should just check if any function passed to the constructor gets called. So you don't need a mock, instead just pass a lambda that just record with a boolean (or a counter).

bool gotCalled = false;
A a( [&gotCalled]( const std::string&, const std::string& ) { gotCalled = true; return true; } );
...
ASSERT_TRUE( gotCalled );

Upvotes: -3

Related Questions