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

时间:2017-09-11 14:17:42

标签: unit-testing googletest gmock

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

MOCK_METHOD(func, void(MyObj &obj);

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

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

我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

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

这可以通过documentation中所述的Invoke()操作来完成:

  

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

     

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

在您的情况下,类似以下代码的代码应该起作用:

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

答案 1 :(得分:-1)

你可以为它写一个custom action

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

然后使用该动作。

但请注意,capturedObj只有在运行测试代码时才会初始化,并且只有在执行{{1}后EXPECT_CALL实际上与调用匹配时才会初始化 宏。