试想一下,我们有这样一个类:
class Testee
{
public:
void Func()
private:
void auxFunc()
};
我们希望做就可以了白盒单元测试。你认为这是一个更好的办法?要声明的测试类被测者阶级的朋友吗?或使用这样的预处理:
class Testee
{
public:
void Func()
#ifndef UNITTEST_SYMBOL
private:
#elif
public:
#endif
void auxFunc()
};
后来在测试文件
#define UNITTEST_SYMBOL
#include "Testee.h"
#undef UNITTEST_SYMBOL
所以,再一次,你认为这是一个更好的办法?或者,也许你可以建议另一种方法。
怎么样:
#ifndef UNITTEST_SYMBOL
#define semiprivate private
#else
#define semiprivate public
#endif
并声明你的类,如:
class Testee
{
public:
void Func()
semiprivate:
void auxFunc()
};
甚至,如果你足够大胆,测试时做#define private public
。
在单元测试文件。你可以试试
#define private public
#include "Testee.h"
这是我做的,这意味着有不相关的头文件中的单元测试什么。我觉得这是因为我觉得很难的时候有很多的#ifdef我的代码中遵循非常有用的。
然后,我有我的所有其他头文件中的#define前
使用方法的朋友,该声明将取决于测试类的名称,因此,如果你改变它的名字的声明必须随之改变。此外我使用单元测试++所以实际测试CALSS名由宏形成。
与定义该方法是麻烦小于。另外,我只是把定义为一个全球性的编译器选项,而不是你带路,例如
gcc -DUNIT_TESTING_ON
#ifdef UNIT_TESTING_ON
public: //or protected maybe
#else
private:
#endif
任何人阅读这也将看到目的是什么,这比查找朋友的定义,看看到底为什么你做它的朋友更加清晰。
下面是人们遵循白盒测试的方式,
#define private friend cTestDriver; private
#define protected friend cTestDriver; protected
//included all your class header from which you like to access
//the private/protected method
#include Testee.h"
#undef private
#undef protected
该类cTestDriver将有包装/ setter方法/干将访问所有的private和protected成员。
你也需要理智约的头文件的顺序。
对于例如:
File1.h
#include "Testee.h"
--
--
--
#include File1.h
#define private friend cTestDriver; private
#define protected friend cTestDriver; protected
//included all your class header from which you like to access
//the private/protected method
#include Testee.h"
#undef private
#undef protected
在上述情况下,同时我们打开File1.h的Testee.h将被打开。因此,宏不会是有效的在这里。
注意:您可能会收到警告有关朋友的多次声明。