C++ 对私有成员的单元测试c++ unit test for class private member

C++ 对私有成员的单元测试

本文记录了如果用 gtest 对 C++ 进行单元测试

Why

既然是类私有成员当然是不希望外部可以访问的,会提示私有成员无法访问。

How

C++ 如果想在外部访问类的私有成员,可以将外部函数定义成友元;
gtest 正是使用此方法,将对应的测试函数定义成类的友元。
付出的代价是对原代码的侵入。

我们用一个例子来描述:

原始类:

1
2
3
4
5
6
7
8
9
class Example
{
public:
Example():number(0){}
...
private:
SetNum();
int number;
};

测试 Example 私有成员:

  • 需要在代码文件中增加 gtest 头文件
1
#include "gtest/gtest_prod.h"
  • Example类增加gtest提供的宏FRIEND_TEST
1
FRIEND_TEST(ExmapleTest, testSetNum);

表示把TEST(ExampleTest, testSetNum) 设置为友元

此时的类文件:

1
2
3
4
5
6
7
8
9
10
11
#include "gtest/gtest_prod.h"
class Example
{
public:
Example():number(0){}
...
FRIEND_TEST(ExampleTest, testSetNum);
private:
SetNum();
int number;
};
  • 测试代码
1
2
3
4
5
6
TEST(ExampleTest, testNumber){
Example example;
SetNum(1);
...
EXPECT_EQ(1,example.number);
}

注: 有 namespace 时需要保持与被测试类一致