Правильно ли использовать FRIEND_TEST?

Когда я изучаю реализацию FRIEND_TEST на странице https://github.com/google/googletest/blob/master/googletest/include/gtest/gtest_prod.h я вижу следующее:

#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
// When you need to test the private or protected members of a class,
// use the FRIEND_TEST macro to declare your tests as friends of the
// class.  For example:
//
// class MyClass {
//  private:
//   void MyMethod();
//   FRIEND_TEST(MyClassTest, MyMethod);
// };
//
// class MyClassTest : public testing::Test {
//   // ...
// };
//
// TEST_F(MyClassTest, MyMethod) {
//   // Can call MyClass::MyMethod() here.
// }
#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test
#endif 

Если я правильно понимаю, тестовый класс безоговорочно становится потомком производственного класса. Это сделало бы производственный класс зависимым от тестового класса. По сути, производственный код также будет содержать мои тестовые библиотеки.

Я не уверен, что это правильно.

Я что-то упустил здесь или это должно быть скомпилировано только условно?

Спасибо.


person Karthick S    schedule 27.10.2012    source источник


Ответы (1)


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

class Production
{
   friend class WibbleWibble;
   ...
};

Этот код совершенно правильный, даже если WibbleWibble не существует. Так что зависимости нет.

person john    schedule 27.10.2012
comment
На самом деле зависимость обратная. Делая тестовый класс другом производственного класса, вы делаете тестовый класс зависимым от реализации производственного класса. Это не идеально, но я думаю, что иногда это необходимо в реальном мире. - person john; 27.10.2012