Как избежать указателей с Google Mock?

В нашем проекте мы используем Google Mock, но в нескольких местах мы делаем конструкторы в нашем производственном коде, только для того, чтобы убедиться, что классы являются "mockable". Мы делаем это потому, что хотим использовать преимущества Google Mock, но, с другой стороны, мы бы предпочли иметь более оптимальный производственный код. Следующий случай - это то, что мы часто делаем и хотели бы избавиться.

class A{
  public:
    void doSomething(); //Does something with _someB
    void setSomeB(B* mockedB); //This is only here for GMock
  private:
    B* _someB; //This should not be a pointer, it is a pointer only for GMock
}

Это только упрощенный пример, как вы можете видеть, я упустил детали. По сути, мы хотим избавиться от того, чтобы B был указателем. Причина, по которой мы используем его в качестве указателя, заключается в том, что мы можем создать подкласс B в нашем тестовом коде (смоделировать его) и установить его с помощью этого установщика.

Есть ли способ избежать этого? Разве мы не можем позволить B быть ограниченным в классе?

Спасибо

1 ответ

Решение

Если ты действительно не хочешь _someB Если указатель хранится в виде указателя, можно заключить его объявление в команды препроцессора:

#ifdef MOCK_TEST
    B _someB;
#else
    MockB _someB;
#endif

Если вы этого не сделаете, нет простого способа поместить ожидания и / или утверждения Gmock в _someB, поскольку он не будет экземпляром фиктивного объекта. Помимо уродства, у него также есть недостаток: Class A постоянно компилируется, один раз с MOCK_TEST определяется и один раз без. Это, однако, избавляет от необходимости установки для _someB,

Даже если вы решите сохранить _someB в качестве указателя, возможно, лучший вариант, чем создание открытого установщика, - объявить тестовый класс другом. Aчтобы позволить тесту напрямую установить и получить доступ _someB,


Кроме того, часто считается плохой формой называть переменные с начальным подчеркиванием.

Другие вопросы по тегам