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

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

我的class的构造函数是

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

我想用EXPECT_CALL来测试一下。这个回调来自另一个class 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 对象的函数指针?

谢谢!!

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

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

如果您想使用 mock 来跟踪调用并设置 return 值,您可以使用 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()
   ...);