2

我正在为我的项目在 QT 中实现一个测试类。我已经为所有公共函数添加了测试,但是有几个私有函数希望包含在我的测试中。

显然这是行不通的,因为它们是私有成员函数,但我想知道是否可以在我想从测试用例访问它们的基础上绕过它,我不想更改我的代码以便我的测试工作,因为那不是真的很有帮助,我喜欢这些功能是私有的,但我也希望能够测试它们。

只是想知道是否有人对这是否可能有任何想法,或者我是否需要将我的函数更改为受保护的或其他东西,然后为我的测试继承该类?

4

2 回答 2

2

通常的做法是只对公共函数进行单元测试,但您可以将测试类作为原始类的朋友。像这样的东西:

朋友的声明应该在#define UNIT_TEST旗帜内。

#include <iostream>

class ToTestClass 
{
 #ifdef UNIT_TEST
    // ToTestClass declares TesterClass as a friend.
    friend class TesterClass;
 #endif

private:
    void privateMethod()
    {
        std::cout << "hey there" << std::endl;
    }
};

class TesterClass
{
public:
    TesterClass()
    {
        ToTestClass  totest;
        // TesterClass now has access to ToTestClass's private members and methods.
        totest.privateMethod();
    }
};

int main()
{
    TesterClass tester;
    return 0;
}
于 2013-04-29T10:16:10.803 回答
1

选项一。您的函数可能有条件地是公有私有的

#ifdef UNIT_TEST
#define ut public
#else
#define ut private

class Testee
{
    public:
    ....


    ut:
    //private functions to be tested


    ptivate:
};

然后,在您的测试标头中,只需

#define UNIT_TEST
#include <Testee.h>

如果测试和应用程序位于同一个项目(程序)中,这有点危险,因为根据标准,同一程序中的所有翻译单元中的类定义必须相同,否则会出现未定义的行为。

其次,更简单、更安全的选择是将 Tester 类声明为友元。

class Testee
{
    public:
    ....

    ptivate:
    ....
    friend class Tester;
};
于 2013-04-29T10:08:52.083 回答