期望值存储在Google Test中的什么地方?

时间:2018-10-29 21:37:24

标签: c++ googletest

我在CookBook或Google Test Framework教程的高级部分中都找不到它。例如,我具有创建期望的以下功能:

void testFunc()
{
    for (std::size_t i = 0; i < 10; i++)
        EXPECT_CALL(dummyMock, mockFunc).WillOnce(Return(i))    
}

然后我在一些测试用例中调用此功能

TEST(UnitTestCase, TestSomeMockFunc)
{
    TestSomeFunction();
    testFunc();
}

问题是Google Test如何执行testFunc中的代码。它是在TestSomeFunction执行后生成的吗?还是之前,例如在编译期间?最后,执行此功能后,testFunc的每个“ EXPECT_CALL”语句都存储在哪里?

1 个答案:

答案 0 :(得分:1)

我将尝试一个接一个地回答您的问题,然后继续处理您的代码片段问题。

问题是Google Test如何执行testFunc中的代码。
没有。这部分的工作原理与任何C ++代码一样。首先调用TestSomeFunction(),然后调用testFunc(),后者运行10次。这里没什么异常。

是在TestSomeFunction执行之后创建的吗?
是的,因为在testFunc()之后调用了TestSomeFunction()。函数是按顺序调用的,理论上GoogleMock可以应用一些宏魔术,但事实并非如此。

还是在此之前,例如在编译期间?
EXPECT_CALL宏在编译之前的预处理阶段扩展。不管其下有什么,都可以在运行时执行,就像其他任何函数一样。

最后,执行此功能后,testFunc的每个“ EXPECT_CALL”语句都存储在哪里?
我不知道,但是很可能它以某种方式存储在模拟对象(即dummyMock)中。我相信它在那里,因为所有期望都已在模拟的析构函数中得到验证。


现在,关于第一个代码段,这是GoogleMock的一个功能,在大多数情况下,我发现它比有用的功能更烦人。

for (std::size_t i = 0; i < 10; i++)
    EXPECT_CALL(dummyMock, mockFunc).WillOnce(Return(i))

以上代码创建了10个通话期望,但是较新的通话期望遮盖了以前的通话期望。因此,如果您的代码将继续调用mockFunc 10次,那么您将有9个被调用的期望和1个期望被调用了10次(同样失败,它只想调用一次)。

如果您不需要每次调用都返回不同的值,则只需使用

EXPECT_CALL(dummyMock, mockFunc).Times(10).WillRepeatedly(Return(0));

但是,如果每次都需要不同的值,则无需考虑以下几点:

  1. 使用RetiresOnSaturation() -将其添加为链中的最后一个通话(在WillRepeatedly()之后)。这样一来,您就可以避免掩盖先前的期望,因为每个期望在实现后都会被忽略。
  2. 添加期望的相反顺序。-GoogleMock以先进先出(FIFO)的方式添加新期望。这意味着将最先匹配(并执行)最新创建的期望。

因此,要创建GoogleMock期望以使其在每次函数调用时都返回下一个数字,应使用以下代码:

void testFunc()
{
    for (std::size_t i = 9; i >= 0; i++)
        EXPECT_CALL(dummyMock, mockFunc).WillOnce(Return(i)).RetiresOnSaturation();    
}

当然,应该在测试的代码中调用模拟功能之前设置,因为否则GoogleMock将不知道您打算这样做。