模拟 - 方法和工具

Mocking - Methods & Tools

自学了gmock,了解了它的功能。如果我们可以模拟一些方法并测试我们的流程,那就太好了。

我现在的问题是我们有庞大的代码库,它为特定流程调用许多子模块接口 - 即底层 class 方法调用许多子模块/子子模块接口:

  bool classA::methodA(uint64_t number) {
  if (0 == number) {
    return false;
  }
  Foo* p=&obj;
  while (true && (p->*fptr)(number)) {
    if (1 == number) {
      return true;
    } else if (0 == number%2) {
      number = number / 2;
    } else {
      Printer* machine;
      char* buff;
      PTR pmf[2]= {&B::Copy, &B::Append}; 
      (machine->*pmf[APPEND])(buff, number);
      number = 3 * number + 1;
    }
  }
}

是否有一种方法/机制/经验法则可以用来识别/了解需要模拟以测试我的 class 100% 代码的子模块的所有方法?

这里不需要规定。您只需嘲笑需要嘲笑的事物。不多也不少。

记住:你编写单元测试的想法是在隔离中测试你的单元。这意味着您有时必须 "cut out" 您的单元对其他代码的依赖性。

现在假设您的代码使用了一些依赖项 B。

  • 当您可以调用您的代码时,将真正的 B 保持在适当的位置 - 很好。那就做吧。
  • 当 B 在您的单元测试设置 中失败时,您需要控制 B returns 对您的代码的影响- 那么你需要一个模拟。

从这个意义上说,经验法则是:如果必须的话,请模拟一些事情。

因此我们无法告诉您究竟要模拟什么。相反,你必须退后一步:

  • 首先,了解您希望如何对您的代码进行单元测试
  • 那你看看它的依赖关系
  • 然后你可以试验当你调用你的代码时会发生什么没有任何模拟
  • 然后根据前面步骤收集的数据得出结论