C++ 如何使用私有构造函数对类进行单元测试?
我有一门课。我只想允许Bar创建它,所以我将其构造函数设置为私有,并将Bar设置为好友。但是现在我如何对Foo的公共方法(例如getValue)进行单元测试呢?我没有办法在单元测试文件中创建它的实例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
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
编译单元测试,这将允许您访问私有成员