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

这两天在用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
这一问题目前还没有找到解决方案……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。