我在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”语句都存储在哪里?
答案 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));
但是,如果每次都需要不同的值,则无需考虑以下几点:
RetiresOnSaturation()
-将其添加为链中的最后一个通话(在WillRepeatedly()
之后)。这样一来,您就可以避免掩盖先前的期望,因为每个期望在实现后都会被忽略。因此,要创建GoogleMock期望以使其在每次函数调用时都返回下一个数字,应使用以下代码:
void testFunc()
{
for (std::size_t i = 9; i >= 0; i++)
EXPECT_CALL(dummyMock, mockFunc).WillOnce(Return(i)).RetiresOnSaturation();
}
当然,应该在测试的代码中调用模拟功能之前设置,因为否则GoogleMock将不知道您打算这样做。