无法引用测试夹具的默认构造函数

Default constructor of test fixture cannot be referenced

我在 Visual Studio 2015 年使用 Google Test 编译带有测试夹具的文件时遇到问题。我正在尝试为其创建测试夹具的 class 名为 计数器

测试中的计数器 class 有一个受保护的默认构造函数,用于初始化各种受保护的成员变量。 Counter class 中的这些成员变量包括对象、指向 const 对象的指针、整数和双精度数。

DefaultConstructor 测试编译失败并显示以下错误消息 the default constructor of "CounterTest" cannot be referenced -- it is a deleted function

明确地说,我正在尝试在 CounterTest class(测试夹具)中实例化一个 Counter 对象(使用它的默认构造函数)以在各个测试中使用。

// Counter.h
class Counter : public ConfigurationItem {
protected:
    EventId startEventIdIn_;
    int numStarts_;
    CounterConfigurationItem_Step const* currentStep_;
    double startEncoderPosMm_;
private: 
    FRIEND_TEST(CounterTest, DefaultConstructor);
};

// GTest_Counter.cpp
class CounterTest : public ::testing::Test {
protected:
    Counter counter;
};

TEST_F(CounterTest, DefaultConstructor)
{
    ASSERT_EQ(0, counter.numStarts_);
}

我做错了什么?甚至可以让测试装置与正在测试 protected/private 成员访问的 class 成为朋友吗?谢谢!

我猜您没有 post class CounterTest 的完整定义,因为如果我添加虚拟 Counter class:

class Counter
{
public:
    int numStarts_;
};

由于错误消息提示 classCounterTest 没有默认构造函数,我猜测您向 class 添加了一个非默认构造函数。在 C++ 中,这意味着如果您未明确指定默认构造函数,则默认构造函数将被删除。这是一个问题,因为 googletest 仅使用默认构造函数实例化测试夹具 classes,您不能使用非默认构造函数来实例化测试夹具。如果您需要在每次测试之前执行一些不同的操作,您可以将带有参数的 SetUp 方法版本添加到夹具 class 并在每次测试开始时使用所需的输入参数调用它。

解决方案:将 CounterTest 声明为好友 class。

class Counter : public ConfigurationItem {
protected:
    EventId startEventIdIn_;
    int numStarts_;
    CounterConfigurationItem_Step const* currentStep_;
    double startEncoderPosMm_;
private: 
    friend class CounterTest;
    FRIEND_TEST(CounterTest, DefaultConstructor);

};