如何使用gmock模拟std :: function?

时间:2017-03-01 00:18:52

标签: unit-testing testing tdd googletest gmock

我班级的构造函数是

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

我想用EXPECT_CALL来测试它。这个回调来自另一个类B.我创建了一个类似

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

然后我试了

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);

它仍然不起作用。如何获取gmock对象的函数指针?

谢谢!

2 个答案:

答案 0 :(得分:1)

使用单元测试,你应该只测试你的A类,所以你的测试应该检查传递给构造函数的任何函数是否被调用。 所以你不需要模拟,只需传递一个只用布尔值(或计数器)记录的lambda。

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

答案 1 :(得分:1)

如果要使用模拟来跟踪呼叫并设置返回值,则可以使用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()
   ...);