Вопрос:

Как подружить классы google-test с моими классами?

c++ friend googletest

24883 просмотра

4 ответа

11730 Репутация автора

Я слышал, что есть возможность включить google-test друзей классов TestCase в мои классы, что позволяет тестам получать доступ к моим личным / защищенным членам.

Как это сделать?

Автор: pajton Источник Размещён: 07.03.2010 01:22

Ответы (4)


34 плюса

391 Репутация автора

Решение

Попробуйте это (прямо из Google Test Docs ...):

FRIEND_TEST(TestCaseName, TestName);

Например:

// foo.h
#include <gtest/gtest_prod.h>

// Defines FRIEND_TEST.
class Foo {
  ...
 private:
  FRIEND_TEST(FooTest, BarReturnsZeroOnNull);
  int Bar(void* x);
};

// foo_test.cc
...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}
Автор: hobbit Размещён: 07.03.2010 01:38

23 плюса

262 Репутация автора

Я знаю, что это старый, но я искал тот же ответ сегодня. «gtest_prod.h» просто представляет простой макрос для ссылки на тестовые классы.

#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test

Так FRIEND_TEST(FooTest, BarReturnsZeroOnNull);что эквивалентно:

friend class FooTest_BarReturnsZeroOnNull_Test;

Это работает, потому что каждый тест - это собственный класс, как упоминалось в предыдущем ответе.

Автор: Ralfizzle Размещён: 08.10.2012 04:18

3 плюса

10398 Репутация автора

Гораздо лучшая стратегия состоит в том, чтобы не допустить тесты друзей среди ваших юнит-тестов.

Разрешение тестов друзей на доступ к закрытым членам приведет к созданию базы кода, которую сложно поддерживать. Тесты, которые ломаются всякий раз, когда реорганизуются внутренние детали реализации компонента, не то, что вам нужно. Если вместо этого приложить дополнительные усилия для разработки проекта, в котором компоненты могут быть протестированы через их открытый интерфейс, вы получите тесты, которые нужно обновлять только при обновлении открытого интерфейса компонента.

Тесты, на которые gtest/gtest_prod.hможно положиться, следует рассматривать как признак плохого дизайна.

Автор: Martin G Размещён: 18.04.2017 05:30

0 плюса

41 Репутация автора

Когда ваш тестируемый класс и ваш тестовый класс находятся в другом пространстве имен (например, ваши тесты находятся в глобальном пространстве имен), вам может потребоваться предварительно объявить тестовый класс и добавить префикс пространства имен в FRIEND_TEST:

// foo.h
#include <gtest/gtest_prod.h>

class FooTest_BarReturnsZeroOnNull_Test;

// Defines FRIEND_TEST.
class my_namespace::Foo {
  ...
 private:
  FRIEND_TEST(::FooTest, BarReturnsZeroOnNull);
  int Bar(void* x);
};

// foo_test.cc
using namespace my_namespace;

...
TEST(FooTest, BarReturnsZeroOnNull) {
  Foo foo;
  EXPECT_EQ(0, foo.Bar(NULL));
  // Uses Foo's private member Bar().
}
Автор: Corentor Размещён: 16.07.2019 09:08
32x32