Как избежать указателей с 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
,
Кроме того, часто считается плохой формой называть переменные с начальным подчеркиванием.