C ++单元测试:更改成员范围

时间:2016-08-19 19:21:30

标签: c++ unit-testing

我正在为我的班级编写单元测试,并希望使用私有的方法。我正在做这样的事情:

class MyClass {
    Myclass() {}
    ~MyClass() {}
#ifdef TESTING
public:
#else
private:
#endif
    void MyMethod1();
    void MyMethod2();
};

如果定义了TESTING,我会更改类签名以使所有内容都公开。在我的测试代码中,我只是这样做:

#define TESTING
#include "MyClass.h"
void MyTestMethod()
{
    MyClass mc;
    mc.MyMethod1(); // Now I can access MyMethod1
}

所以它只在我的测试文件中公开,而不是其他任何地方。我的测试可执行文件看到一个标题,描述了一个全部公开的类。该类的代码实际上是在其他地方构建的(其中TESTING未定义),因此当测试项目链接到库时,范围会有所不同。

这有可能破坏任何东西吗?我担心如果标题与目标文件中实际生成的标题不同,这可能会改变vtable位置或编译器和链接器的期望。

2 个答案:

答案 0 :(得分:5)

您最终会面临低质量测试的风险。测试一些实现细节的测试与类的实际功能无关。测试公共接口只会让您走向一个良好的设计和测试用例,可以在不破坏的情况下支持代码重构。

答案 1 :(得分:0)

很难看,虽然它可行,但不要这样做,而是为您的测试创建一个包装类,并在MyClass中使用friend TestClass;关键字。