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

时间:2016-07-19 22:35:50

标签: c++ unit-testing visual-studio-2015 googletest default-constructor

我在Visual Studio 2015中使用Google Test编译带有测试夹具的文件时出现问题。我尝试创建测试夹具的类名为 Counter

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

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

要清楚,我试图在CounterTest类(测试夹具)中实例化一个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_);
}

我做错了什么?是否可以让测试夹具成为正在测试受保护/私有成员访问的类的朋友?谢谢!

2 个答案:

答案 0 :(得分:0)

我猜你没有发布类CounterTest的完整定义,因为如果我添加一个虚拟Counter类,你发布的代码编译时没有错误:

class Counter
{
public:
    int numStarts_;
};

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

答案 1 :(得分:0)

解决方案:将CounterTest声明为朋友类。

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

};