代码之家  ›  专栏  ›  技术社区  ›  pajton

如何让google测试类和我的类成为朋友?

  •  29
  • pajton  · 技术社区  · 16 年前

    3 回复  |  直到 16 年前
        1
  •  49
  •   hobbit    16 年前

    试试这个(直接从谷歌测试文档…):

    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().
    }
    
        2
  •  35
  •   Gabriel Staples    5 年前

    我知道这很古老,但我今天也在寻找同样的答案。” 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;
    

    这是因为如前一个答案所述,每个测试都是自己的类。

        3
  •  7
  •   Martin G    9 年前

    允许好友测试访问私有成员将导致代码库很难维护。在重构组件的内部实现细节时中断的测试不是您想要的。如果将额外的精力放在设计上,使组件可以通过其公共接口进行测试,那么您将得到只需要在组件的公共接口更新时进行更新的测试。

    测试依赖于 gtest/gtest_prod.h 应该被视为设计拙劣的标志。

        4
  •  4
  •   Corentor    6 年前

    当您的测试类和您的测试类位于不同的命名空间中(例如,您的测试位于全局命名空间中)时,您可能需要向前声明您的测试类,并在FRIEND\u 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().
    }
    

    我知道,朋友单元测试(或者C++中的友好性)和白盒测试是一个有争议的主题,但是当你处理复杂的科学算法时,你需要测试和验证的每一步,但是你不想公开(甚至是受保护的)接口,朋友测试在我看来是一个简单而实用的解决方案,尤其是在测试驱动的开发方法中。如果使用友好性或白盒测试违背了自己的宗教信仰,那么以后重构代码(或者完全删除白盒测试)总是有可能的。