首页 > 解决方案 > 指向这个定义的内部类的静态指针,用于 googletest 的模拟

问题描述

我试图理解为什么生产中的一段代码是按以下方式设计的:为了给人们一些上下文,有一个A类包含一个方法,称为some_method,需要模拟。模拟和所有测试都需要与生产代码隔离。所以我的同事所做的就是通过以下方式在 test 文件夹中重新定义这个类:

class A
{
    class mockA
    {
     public: 
          mockA()
          {
              pointer_mockA = this;
          }
          virtual ~mockA(){
               pointer_mockA = NULL;
          }
         MOCK_METHOD1(some_method, string&(bool x));
         static mockA* pointer_mockA;

     }
string &some_method(bool x);

}

同样在头文件中,some_method()定义如下:

string& some_method(bool x)
    {
        return mockA::pointer_mockA->some_method(x);
    }

mockA::pointer_A在 cpp 测试文件中被初始化为 NULL。

问题

  1. pointer_mockA 作为静态指针是否指向类 A 的当前实例?或者只是为什么要使用它?
  2. 为什么在这个测试头文件中重新定义了A类,而它已经存在于需要测试的代码所在的文件夹中?
  3. 这种设计很常见吗?没有其他更简单的设计吗?
  4. 非常感谢对代码的任何其他评论。

标签: c++pointersstaticmockinggoogletest

解决方案


1. pointer_mockA 指向最后创建的实例或空/nullptr。它在应用程序启动后和每次对 mockA 对象的破坏后都没有指向任何内容。

2. 原因可能是,因为 mockA 是 A 的嵌套类。不幸的是,c++ 不允许这些嵌套类的独立定义。只能在外部类中前向声明一个嵌套类,然后再定义它。

3. 常见吗?我会说不。有一些奇怪的事情:为什么 pointer_mockA 是一个公共字段。为什么会有这个静态指针?宏 MOCK_METHOD1 的定义是什么?成为多态类(虚拟析构函数)重要吗?


推荐阅读