c++ - 如何使用 UnitTest++ 从测试中访问私有(private)类字段?

标签 c++ unit-testing unittest++

我在使用 UnitTest++ 编写单元测试时遇到了麻烦。 .我想知道如何以干净的方式(或者任何方式......)访问 私有(private)成员类字段

现在,我有了一个解决方案,可以使用派生自被测类的类固定装置访问 protected 成员。下面的代码展示了这个想法:

struct MyFixture : ClassUnderTest { };

TEST_FIXTURE(MyFixture, OneTest)
{
    do_something();
    CHECK(protected_field == true);
}

不过,我认为这不是很干净,因为在某些配置中可能会出现与继承相关的问题,而且无论如何,只能访问和测试 protected 成员。

我试图将测试类声明为 friends,但由于这些是由 UnitTest++ 以某种特殊方式创建的,所以我还没有设法做到。

有没有人知道如何让测试类成为被测类的 friend ?

有没有其他方法可以更简单或不同的方式解决这个问题?

提前谢谢大家。

最佳答案

有一个真的丑陋但非常有用的 hack,我通常用于单元测试:

#define private public
#define protected public

#include "class_to_be_tested.h"

// and here, all class's methods and fields are public :P

不要将它用于单元测试以外的任何事情!

此外,这种方法也有一些限制——首先,并非所有私有(private)内容都以 private 为前缀。其次,一种流行的编译器将访问说明符修改为链接器符号。

另一种也不是很好的方法是通过强制转换。您创建一个具有相同字段但都是公共(public)的结构,并将其强制转换为指向您的私有(private)结构的指针。然而,这有一个缺点,即类需要完全匹配:

class my_class
{
private:
   char name[40];
   char grade;
   int age;
public:
   //
}

struct my_class_hack
{
public:
   char name[40];
   char grade;
   int age;

}

struct hack_it* my_class_hacked = (my_class_hack*)ptr;

...但是,如果编译器对您的代码进行处理,您可能会得到令人讨厌的惊喜,因此切勿将其用于生产代码。

关于c++ - 如何使用 UnitTest++ 从测试中访问私有(private)类字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2085501/

相关文章:

c++ - UnitTest++ 命令行参数

c++ - UnitTest++ 中的断点

c++ - 使用 void * 传递变量

java - 编写一个程序来遍历另一个程序

python - 如何使用 python 对模块中具有相同公共(public) API 的每个类进行单元测试?

c++ - Unittest++:测试多个可能值

c++ - 如何将 CryptoPP::Integer 转换为 char*

c++ - 陷入无限递归

python - 使用python的unittest模块出现未绑定(bind)错误

javascript - Jest - 监视嵌套的 promise (axios)