C++ 如何使用私有构造函数对类进行单元测试?

C++ 如何使用私有构造函数对类进行单元测试?,c++,unit-testing,C++,Unit Testing,我有一门课。我只想允许Bar创建它,所以我将其构造函数设置为私有,并将Bar设置为好友。但是现在我如何对Foo的公共方法(例如getValue)进行单元测试呢?我没有办法在单元测试文件中创建它的实例 class Foo final { public: int getValue(); private: friend class Bar; Foo(int value); }; class Bar { protected: Foo createFoo(int valu

我有一门课。我只想允许Bar创建它,所以我将其构造函数设置为私有,并将Bar设置为好友。但是现在我如何对Foo的公共方法(例如getValue)进行单元测试呢?我没有办法在单元测试文件中创建它的实例

class Foo final
{
public:
    int getValue();
private:
    friend class Bar;
    Foo(int value);
};

class Bar
{
protected:
    Foo createFoo(int value);
};

您可以为单元测试添加额外的friend类

class Foo final
{
public:
    int getValue();
private:
    friend class Bar;
    friend class UnitTests; // Here
    Foo(int value);
};

class UnitTests {
public:
     bool constructor_ok() { Foo test_instance(42); ... }
};

有两种可能的方法

首先,单元测试使用
Bar
实例化
Foo
,然后对
Foo
的公共成员进行测试。这意味着您的单元测试将结合使用
Bar
Foo
,这是适当的,因为(大概)您将
Foo
s构造函数设置为私有,而
Bar
是为了防止
Foo
被单独使用。根据
Bar
的定义方式,您可能需要单独的单元测试来单独执行
Bar
(即独立于
Foo

第二个选项是将另一个类声明为
friend
,然后使用该类在
Foo
上独立于
Bar
执行测试


就我个人而言,我更喜欢第一种选择。对于第二个选项,
Bar
的工作可能与
Foo
s单元测试的工作不同步(反之亦然),这意味着第二个选项将引入通过单元测试的可能性,然后用
Bar
Foo

的错误交互来发布程序,也许您需要稍微修改一下“单位”的定义。关键是,由于类只能通过工厂创建,所以它的构造函数不是接口的一部分。因此,这两个类一起构成一个单元,而不是单独的单元。如果您使用gcc或clang,您可以使用
-fno access control
编译单元测试,这将允许您访问私有成员