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

How to unit test a class with private constructor?

本文关键字:单元测试 何使用 构造函数      更新时间:2023-10-16

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

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

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

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的公共成员进行测试。 这意味着您的单元测试将BarFoo结合起来进行工作,这是合适的,因为(大概(您打算将Foo构造函数设为私有并Bar朋友是为了防止Foo单独使用。 根据Bar的定义方式,您可能需要单独的单元测试来单独执行Bar(即独立于Foo(。

第二种选择是将另一个类声明为friend,然后使用该类独立于BarFoo上实现测试。

就个人而言,我更喜欢第一种选择。 使用第二个选项,存在Bar的工作与Foo单元测试的工作不同步的风险(反之亦然( - 这意味着第二个选项将引入通过单元测试的可能性,然后发布程序与BarFoo的错误交互。