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

4

我有一个名为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);
};

4
也许你需要稍微修订一下“单元”的定义。重点在于,由于你的类只能通过工厂创建,它的构造函数并不是接口的一部分。因此,这两个类共同形成一个单元,而不是各自作为单元。 - Ulrich Eckhardt
如果您正在使用gcc或clang,您可以使用-fno-access-control编译您的单元测试,这将允许您访问私有成员。 - Praetorian
2个回答

3

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

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); ... }
};

0

有两种可能的方法。

第一种是让单元测试利用Bar来实例化Foo,然后在Foo的公共成员上进行测试。这意味着您的单元测试会同时测试BarFoo的工作,这是合适的,因为(假设)您将Foo的构造函数设置为私有,并将Bar设置为友元是为了防止Foo被单独使用。根据Bar的定义方式,您可能需要单独编写单元测试来测试Bar(即独立于Foo)。

第二种选择是声明另一个类为friend,然后使用该类来独立于Bar实现对Foo的测试。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接