c++ - 在循环中添加预期的调用

标签 c++ unit-testing googletest googlemock

这就是我想要实现的目标。在我的测试装置中,我想使用参数 n 来调用辅助函数来告诉测试装置应该有多少个初始化序列。序列中使用的一些参数存储在三个 std::vector 容器中; fileDescriptor、句柄、selectionObject

我写的是这样的:

void MyTest::init_Ok(uint32_t n)
{
  for (uint32_t i = 0; i < n; ++i)
  {
    fileDescriptor.push_back(i); // FDs starting at 0
    handle.push_back(reinterpret_cast<void*>(18 + i)); // handles starting at 18
    selectionObject.push_back(555 + i); // SOs starting at 555

    EXPECT_CALL(MyMockApi::getApi(), initialize(Pointee(nullptr), StrEq("InitString"), MyMatcher()))
      .WillOnce(DoAll(SetArgPointee<0>(handle[i]),
                      Return(INIT_OK)));
    EXPECT_CALL(MyMockApi::getApi(), selectionObjectGet(handle[i], Pointee(nullptr)))
      .WillOnce(DoAll(SetArgPointee<1>(selectionObject[i]),
                      Return(SELECTION_OK)));
    EXPECT_CALL(MyMockApi::getApi(), finalize(handle[i]))
      .WillOnce(Return(FINAL_OK));
  }
}

我知道为什么它不起作用。预计对 initialize 的所有调用都是相同的,但我想对第一个、第二个、第三个执行不同的操作(参数取决于循环计数器 i)。 ..,第 n 个电话。当前的实现只需要一次对 initialize 的调用,无论参数 n 是什么。是否可以修复此问题并以某种方式保持循环,或者我是否必须为每个 i 添加带有 WillOnce 行的操作?这意味着我必须检查 n 并为 n 的不同可能值添加不同数量的 WillOnce 行,我真的想避免这种情况。

最佳答案

一种方法是使用Invoke。您可以编写一个函数,该函数可以访问句柄容器和一个正在运行的成员/静态变量(比如说 counterVar),该变量将指示该函数被命中的次数。根据counterVar的值,你可以决定逻辑。

.WillRepeatedly(Invoke(<your function>))

类似于:

EXPECT_CALL(MyMockApi::getApi(), initialize(Pointee(nullptr), StrEq("InitString"), MyMatcher()))
      .WillRepeatedly(Invoke(successfulInitialize));

ReturnCode successfulInitialize(void* op, std::string msg)
{
   static int counterVar = 0;
   *op = handles[counterVar++];
   return INIT_OK;
}

关于c++ - 在循环中添加预期的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38826004/

相关文章:

c++ - 统计大数据流中每个元素出现的次数

c# - 犀牛模拟 : Verify all mocks in AAA syntax

python 模拟第三方模块

c++ - Google 测试 - 构造函数声明错误

c++ - 运行 GTest 时指针无效

c++ - 将 OpenCV 构建为静态库会导致数以千计的 undefined reference

c++ - 为什么用结构体初始化数组需要指定结构体名称

c++ - 如何从方法返回动态指针数组

android - android.unitTests.returnDefaultValues 是如何工作的?

c++ - CMake:将 GTest 添加到构建中