如何测试类的私有成员函数

问题遇到的现象和发生背景

如何测试类的私有成员函数

遇到的现象和发生背景,请写出第一个错误信息

如何测试类的私有成员函数

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

base.h的内容

class Base
{
public:
    virtual void run(void) = 0;

    static Base& instance(void);
};

a.cpp的内容
#include "base.h"
class A : public Base
{
public:
    virtual void run(void)
    {
        std::cout << "A.run() called." << std::endl;
        f1();
        f2();
    }
private:
    void f1(void)
    {
    }

    void f2(void)
    {
    }
};

Base& Base::instance(void)
{
    static A sa;
    return sa;
}

现在,我如何测试A.f1, A.f2 ?

运行结果及详细报错内容

如何测试A.f1, A.f2 ?

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

把f1,f2定义成A的Public方法,且增加头文件a.h

class A : public Base
{
public:
    virtual void run(void);
    void f1(void);
    void f2(void);
};

然后在a.cpp中写实现,但这样原本封装在A的实现中的f1,f2暴露了。

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

如果需要测试类中的私有成员函数,一种常用的方法是使用友元类或友元函数,在测试类中通过友元关系访问私有成员。
另外一种方法是使用私有继承。在测试类中继承需要测试的类,由于继承是类型转换关系,所以测试类可以访问父类的私有成员。

代码示例如下:

class A;
class TestA
{
public:
void testF1(A& a);
};

class A : public Base
{
friend class TestA;
private:
void f1(void);
void f2(void);
};

void TestA::testF1(A& a)
{
a.f1();
}

class TestA
{
public:
void testF1(A& a);
};

原来A在a.cpp中,对外完全不可见。
按你的思路,需要将A提出到a.h中吧。
另外,由于在A中增加友元类TestA,对A是侵入式修改,而且TestA会业务代码一起编译,这些都不是我希望的。