我在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_);
}
我做错了什么?是否可以让测试夹具成为正在测试受保护/私有成员访问的类的朋友?谢谢!
答案 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);
};