美文网首页
gtest如果要访问protected成员怎么办?

gtest如果要访问protected成员怎么办?

作者: 7bfedbe4863a | 来源:发表于2018-01-12 23:02 被阅读0次

    这两天在用gtest对类进行测试的时候,发现了一些问题,目前最麻烦的大概就是对protected的函数进行测试了。
    一开始,在查资料的时候,查到的解决方案大概都是以下两个:

    1. 使用FRIEND_TEST,把测试类(或函数)作为友元类(或函数)添加到被测类里,这样就可以访问protected/private了。但是这种方法要改动原工程的内容,并不是一个好的解决方法,所以舍弃了这种方法。
    namespace my_namespace {
    
    class Foo {
      friend class FooTest;
      FRIEND_TEST(FooTest, Bar);
      FRIEND_TEST(FooTest, Baz);
      ...
      definition of the class Foo
      ...
    };
    
    }  // namespace my_namespace
    

    像这种被测类在命名空间里的,测试类也要放在my_namespace命名空间中

    namespace my_namespace {
    class FooTest : public ::testing::Test {
     protected:
      ...
    };
    
    TEST_F(FooTest, Bar) { ... }
    TEST_F(FooTest, Baz) { ... }
    
    }  // namespace my_namespace
    
    1. 被测试的源文件不需要任何修改,只要定义下面有个头文件CxxTestDefs.h,然后在测试类的.cpp文件中#include "CxxTestDefs.h"就可以了。在测试类的.cpp文件中,#include "CxxTestDefs.h"必须放在被测试类的#include行的上面,这样被测试类中的private, protected关键字就会被替换成public,测试类就能访问了。
    • 然而这一种方法在vs2008中行不通,加上这些代码,会使得gtest本身的函数无法识别,所以这种方法舍弃。
    #ifndef __CXX_TEST_H__
    #define __CXX_TEST_H__
    
    #define private   public
    #define protected public
    
    #endif //__CXX_TEST_H__
    

    之后考虑了一下,如果只是对protected的成员函数进行测试,测试类可以直接继承被测类,这样就可以调用protected的成员函数了。

    class FooTest:public testing::Test,Foo{
    protected:
      static void SetUpTestCase() {
        ......
      }
      static void TearDownTestCase() {
        ......
      }
      static Foo m_foo;
    };
    

    但是这个也是有一点问题,就是如果被测类没有默认的构造函数,但有带参数的构造函数的时候,也会报错:error C2512:"FooTest":no appropriate default constructor available
    这一问题目前还没有找到解决方案……

    相关文章

      网友评论

          本文标题:gtest如果要访问protected成员怎么办?

          本文链接:https://www.haomeiwen.com/subject/ryyqoxtx.html