我在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”语句的存储位置在哪里?

最佳答案

我将尝试一个接一个地回答您的问题,然后继续处理您的摘录中的问题。

问题是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));


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


使用RetiresOnSaturation()-将其添加为链中的最后一个呼叫(在WillRepeatedly()之后)。这将使您避免隐藏先前的期望的问题,因为每个期望在实现后都会被忽略。
添加期望的倒序。 -GoogleMock以先进先出(FIFO)的方式增加了新的期望。这意味着将最先匹配(并执行)最新创建的期望。


因此,为了以某种方式创建GoogleMock期望值(它将在每次函数调用时返回下一个数字),以下代码应该起作用:

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


当然,应该在测试代码中调用模拟函数之前就设定好期望值,因为否则GoogleMock将不知道您打算这样做。

关于c++ - 期望值存储在Google Test中的什么地方?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53054201/

10-11 19:10