Статический указатель на этот определенный внутри класса для макета для googletest - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь понять, почему часть кода с производства была разработана следующим образом: чтобы дать людям некоторый контекст, существует класс A , содержащий метод, называемый его some_method, это надо издеваться. Макет и все тесты должны быть изолированы от производственного кода. Поэтому мои коллеги переопределили этот класс внутри тестовой папки следующим образом:

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 инициализируется значением NULL в файле тестирования cpp.

Вопросы

  1. Указатель указывает, как статический указатель, на текущий экземпляр класса A? Или просто, почему он используется?
  2. Почему класс A переопределен в этом заголовочном файле тестирования, если он уже существует в папке, где существует код, который нужно проверить?
  3. Этодизайн общий? Разве нет более простого дизайна?
  4. Любые другие комментарии к коду приветствуются.

1 Ответ

1 голос
/ 23 октября 2019

1. pointer_mockA указывает на последний созданный экземпляр или на none / nullptr. Он ничего не указывает после запуска приложения и после каждого уничтожения объекта mockA.

2. Причиной может быть то, что mockA является вложенным классом A. К сожалению, c ++ не допускает изолированных определений этих вложенных классов. Можно только заранее объявить вложенный класс во внешнем классе и определить его позже.

3. Это распространено? Я бы сказал нет. Есть несколько странных вещей: почему pointer_mockA является публичным полем. Почему этот статический указатель? Какое определение для Macro MOCK_METHOD1? Важно ли быть полиморфным классом (виртуальным деструктором)?

...