有些时候,我们不仅要测试类暴露出来的公有方法,还要测试其受保护的或者私有方法。GTest测试框架提供了一种方法,让我们可以测试类的私有方法。但是这是一种侵入式的,会破坏原来代码的结构,所以我觉得还是谨慎使用。(转载请指明出于breaksoftware的csdn博客)

我们先看个例子

// This class has a private member we want to test.  We will test it
// both in a TEST and in a TEST_F.
class Foo {public:Foo() {}private:int Bar() const { return 1; }// Declares the friend tests that can access the private member// Bar().FRIEND_TEST(FRIEND_TEST_Test, TEST);FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
};// Tests that the FRIEND_TEST declaration allows a TEST to access a
// class's private members.  This should compile.
TEST(FRIEND_TEST_Test, TEST) {ASSERT_EQ(1, Foo().Bar());
}// The fixture needed to test using FRIEND_TEST with TEST_F.
class FRIEND_TEST_Test2 : public Test {protected:Foo foo;
};// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
// class's private members.  This should compile.
TEST_F(FRIEND_TEST_Test2, TEST_F) {ASSERT_EQ(1, foo.Bar());
}

Foo类拥有一个名叫Bar的私有成员函数。我们需要通过FRIEND_TEST宏来新增该类的友元类(其实也能想象出来,就是通过友元类来访问私有成员,所以这是一种侵入式的——修改了原来类的结构)

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

上例中给了两种访问私有变量的方式:

  1. 一种是FRIEND_TEST(FRIEND_TEST_Test, TEST);声明的类,然后通过TEST(FRIEND_TEST_Test, TEST)实现测试特例实体,于是该实体中需要使用Foo的构造函数构造一个对象,然后调用其私有的Bar方法。
  2. 一种是FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);声明的类。它使用到了Test Fixtures技术(详见《Google Test(GTest)使用方法和源码解析——预处理技术分析和应用》)。在FRIEND_TEST_Test2类中,声明了一个Foo对象。然后TEST_F(FRIEND_TEST_Test2, TEST_F)类直接使用了该成员变量调用Bar方法。TEST_F(FRIEND_TEST_Test2, TEST_F)既继承于FRIEND_TEST_Test2,又是Foo的友元类。

这块技术没有什么深奥的,大家只要是知道它是通过友元特性实现,是一种侵入式测试就行了。

Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析相关推荐

  1. Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用

    写C++难免会遇到模板问题,如果要针对一个模板类进行测试,似乎之前博文中介绍的方式只能傻乎乎的一个一个特化类型后再进行测试.其实GTest提供了两种测试模板类的方法,本文我们将介绍方法的使用,并分析其 ...

  2. Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用

    在我们设计测试用例时,我们需要考虑很多场景.每个场景都可能要细致地考虑到到各个参数的选择.比如我们希望使用函数IsPrime检测10000以内字的数字,难道我们要写一万行代码么?(转载请指明出于bre ...

  3. Google Test(GTest)使用方法和源码解析——预处理技术分析和应用

    预处理 在<Google Test(GTest)使用方法和源码解析--概况>最后一部分,我们介绍了GTest的预处理特性.现在我们就详细介绍该特性的使用和相关源码.(转载请指明出于brea ...

  4. Google Test(GTest)使用方法和源码解析——断言的使用方法和解析

    在之前博文的基础上,我们将介绍部分断言的使用,同时穿插一些源码.(转载请指明出于breaksoftware的csdn博客) 断言(Assertions) 断言是GTest局部测试中最简单的使用方法,我 ...

  5. Google Test(GTest)使用方法和源码解析——Listener技术分析和应用

    在<Google Test(GTest)使用方法和源码解析--结果统计机制分析>文中,我么分析了GTest如何对测试结果进行统计的.本文我们将解析其结果输出所使用到的Listener机制. ...

  6. Google Test(GTest)使用方法和源码解析——结果统计机制分析

    在分析源码之前,我们先看一个例子.以<Google Test(GTest)使用方法和源码解析--概况 >一文中最后一个实例代码为基准,修改最后一个"局部测试"结果为错误 ...

  7. Google Test(GTest)使用方法和源码解析——自动调度机制分析

    在<Google Test(GTest)使用方法和源码解析--概况 >一文中,我们简单介绍了下GTest的使用和特性.从这篇博文开始,我们将深入代码,研究这些特性的实现.(转载请指明出于b ...

  8. Google Test(GTest)使用方法和源码解析——死亡测试技术分析和应用

    死亡测试是为了判断一段逻辑是否会导致进程退出而设计的.这种场景并不常见,但是GTest依然为我们设计了这个功能.我们先看下其应用实例.(转载请指明出于breaksoftware的csdn博客) 死亡测 ...

  9. Google Test(GTest)使用方法和源码解析——概况

    GTest是很多开源工程的测试框架.虽然介绍它的博文非常多,但是我觉得可以深入到源码层来解析它的实现原理以及使用方法.这样我们不仅可以在开源工程中学习到实用知识,还能学习到一些思想和技巧.我觉得有时候 ...

最新文章

  1. 多态实现机制:静态分派和动态分派
  2. 【博弈论】【SG函数】bzoj1457 棋盘游戏
  3. 解析第一高中教育首份成绩单:营利双增,轻资产模式成“杀手锏”
  4. android 调用系统播放器
  5. 灰色关联与TOPSIS法 —— python
  6. 4-数组、指针与字符串1.4-动态内存分配
  7. 远程桌面剪贴板失效的解决办法
  8. svn .a文件上传不了
  9. How to Install Ruby on Rails on CentOS 6
  10. 细胞亚器互作之细胞代谢调节液泡与线粒体的接触位Cellular Metabolism Regulates Contact Sites between Vacuoles and Mitochondria
  11. mbot机器人自动超声波模式程序_测评 | mBot机器人秒变编程达人
  12. Java类和对象 详解(一)
  13. 什么是SAP Analytics Cloud
  14. Centos 添加新硬盘,分区格式化、挂载硬盘
  15. AD使用技巧——如何改变布线走线的角度
  16. 基于Node.js的3DTiles三维倾斜摄影模型爬虫
  17. 周期为“2L“的函数展开为傅里叶级数
  18. KeyShot Pro 9 v9.0 安装教程(含下载文件)
  19. 米家iHealth体温计拆解
  20. 车间有毒有害气体监控系统项目案例

热门文章

  1. Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测
  2. PCL中点云的超体素(SuperVoxel)
  3. 完整的虚幻引擎超级课程:从初学者到专家
  4. ue4商城素材 Cyberpunk City / Recife Environment 赛博朋克城市场景
  5. Blender未来科幻武器全流程制作视频教程
  6. gcc中-pthread和-lpthread的区别
  7. Mac 从Makefile 编译 Rocksdb 源码的一些注意事项
  8. Callgrind--函数调用分析工具以及可视化方法
  9. 50个顶级开源营销应用程序
  10. Easyui combobox下拉框默认选中第一项