GMock:在模拟函数中捕获引用参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GMock:在模拟函数中捕获引用参数相关的知识,希望对你有一定的参考价值。

我有一个带有引用参数的模拟函数:

MOCK_METHOD(func, void(MyObj &obj);

我想将obj捕获到一个变量中,以便我可以在单元测试中调用它上面的方法。所以类似于:

MyObj *capturedObj;
EXPECT_CALL(foo, func(testing::_)).WillOnce(<capture arg into capturedObj>);
capturedObj->bar();

我该如何实现这一目标?

答案

一种可能的方法是调用一个单独的测试函数,它将为您捕获参数。

这可以通过Invoke()动作完成,如documentation中所述:

调用(f)使用传递给mock函数的参数调用f,其中f可以是全局/静态函数或函子。

Invoke(object_pointer,&class :: method)使用传递给mock函数的参数调用对象上的方法。

在您的情况下,类似下面的代码应该工作:

// Globally, outside your test case
MyObj *capturedObj;

void captureObj(MyObj &obj) {
    captured = &obj;
}

// [..]

// In your test case
EXPECT_CALL(foo, func(testing::_)).WillOnce(testing::Invoke(captureObj));
capturedObj->bar();

如果使用测试夹具,capturedObjcaptureObj可以是类成员,您需要更新语法如下:

  EXPECT_CALL(foo, func(testing::_)).WillOnce(testing::Invoke(this, &TestFixtureClass::captureObj));
另一答案

你可以为它写一个custom action

ACTION_P(SaveArgAddress, p) {
  p = &arg;
}

然后使用该动作。

但请注意,capturedObj只有在运行测试代码时才会初始化,并且只有在EXPECT_CALL实际匹配调用时才会初始化 - 而不是在执行EXPECT_CALL宏之后。

以上是关于GMock:在模拟函数中捕获引用参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gmock 模拟修改 C++ 类中的私有变量的成员函数?

gTest&gMock learning

gmock 如何指定不应该调用其他模拟方法?

如何使用 GMock 模拟 OpenCV 相机,或者如何使用带有 GTest 的相机测试方法?

Gmock当返回多个不同值应该怎么用willrepeatedly

GoogleTest中gMock的使用