我在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/