在googletest
Primer中,有一个示例,其中SetUp
/ TearDown
为virtual
。有人可以解释他们为什么virtual
吗?以下是从入门书中逐字逐句的例子:
class QueueTest : public ::testing::Test {
protected:
virtual void SetUp() {
q1_.Enqueue(1);
q2_.Enqueue(2);
q2_.Enqueue(3);
}
// virtual void TearDown() {}
Queue<int> q0_;
Queue<int> q1_;
Queue<int> q2_;
};
TEST_F(QueueTest, IsEmptyInitially) {
EXPECT_EQ(0, q0_.size());
}
我想知道为什么不把它写成如下。这种行为会改变吗?
class QueueTest : public ::testing::Test {
protected:
void SetUp() override {
q1_.Enqueue(1);
q2_.Enqueue(2);
q2_.Enqueue(3);
}
// void TearDown() override {}
Queue<int> q0_;
Queue<int> q1_;
Queue<int> q2_;
};
TEST_F(QueueTest, IsEmptyInitially) {
EXPECT_EQ(0, q0_.size());
}
答案 0 :(得分:2)
鉴于父类中的SetUp
和TearDown
都被声明为虚拟,子类中的所有三个声明都是等价的:
virtual void SetUp() {}
void SetUp() {}
void SetUp() override {}
我坚持使用override
,因为任何拼写错误(如void setUp() override
)都会导致编译错误。
由于override
关键字仅在C ++ 11中引入,并且Google测试框架在可用之前已创建,我认为文档中未使用override
因为没有人愿意更新它
答案 1 :(得分:0)
在googletest Primer中,有一个例子,其中 SetUp / TearDown是虚拟的。有人可以解释为什么他们是虚拟的? 以下是从入门书中逐字逐句的例子:
class QueueTest : public ::testing::Test { protected: virtual void SetUp() { q1_.Enqueue(1); q2_.Enqueue(2); q2_.Enqueue(3); } // virtual void TearDown() {} Queue<int> q0_; Queue<int> q1_; Queue<int> q2_; }; TEST_F(QueueTest, IsEmptyInitially) { EXPECT_EQ(0, q0_.size()); } I wonder why not writing it as follows. Will the behavior change? class QueueTest : public ::testing::Test { protected: void SetUp() override { q1_.Enqueue(1); q2_.Enqueue(2); q2_.Enqueue(3); } // void TearDown() override {}
使成员函数成为虚拟和受保护意味着可以在需要(自定义)的情况下覆盖成员的范围,而且还有基本成员中的某些必需实现。如果确实选择覆盖,则应调用基本方法。基类Test中的virtual关键字表示存在多态扩展的范围。
我会覆盖如下(仅当我有其他添加行为时):
...
void TearDown() override
{
//Call base TearDown - important
Test::TearDown();
//... My code
}
...
或者(当不需要覆盖时),可以做任何事情,或者使用......
using testing::TearDown;
...向您的班级用户明确表示TearDown是界面的一部分