为什么 `SetUp`/`TearDown` 在 gtest 中是虚拟的?
Why are `SetUp`/`TearDown` virtual in gtest?
在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());
}
In the googletest Primer, there is an example, where the
SetUp/TearDown are virtual. Can someone explain why they are virtual?
Here is an example verbatim from the primer:
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 {}
使成员函数成为虚拟的和受保护的意味着在需要时可以覆盖成员(自定义),但也意味着在基本成员中有一些必需的实现。如果确实选择重写,则应该调用基本方法。 base class Test 中的 virtual 关键字表明存在多态扩展的范围。
我将重写如下(仅当我要添加其他行为时):
...
void TearDown() override
{
//Call base TearDown - important
Test::TearDown();
//... My code
}
...
或者(当不需要覆盖时),可以什么也不做,或者使用...
using testing::TearDown;
...向您的 class 用户表明 TearDown 是界面的一部分
鉴于 SetUp
和 TearDown
在父 class 中都被声明为虚拟的,子 class 中的所有三个声明是等价的:
virtual void SetUp() {}
void SetUp() {}
void SetUp() override {}
我会坚持使用 override
,因为任何拼写错误(如 void setUp() override
)都会导致编译错误。
由于 override
关键字仅在 C++11 中引入,并且 google 测试框架是在它可用之前创建的,我假设 override
未在文档中使用,因为只是没有人费心去更新它。
在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());
}
In the googletest Primer, there is an example, where the SetUp/TearDown are virtual. Can someone explain why they are virtual? Here is an example verbatim from the primer:
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 {}
使成员函数成为虚拟的和受保护的意味着在需要时可以覆盖成员(自定义),但也意味着在基本成员中有一些必需的实现。如果确实选择重写,则应该调用基本方法。 base class Test 中的 virtual 关键字表明存在多态扩展的范围。
我将重写如下(仅当我要添加其他行为时):
...
void TearDown() override
{
//Call base TearDown - important
Test::TearDown();
//... My code
}
...
或者(当不需要覆盖时),可以什么也不做,或者使用...
using testing::TearDown;
...向您的 class 用户表明 TearDown 是界面的一部分
鉴于 SetUp
和 TearDown
在父 class 中都被声明为虚拟的,子 class 中的所有三个声明是等价的:
virtual void SetUp() {}
void SetUp() {}
void SetUp() override {}
我会坚持使用 override
,因为任何拼写错误(如 void setUp() override
)都会导致编译错误。
由于 override
关键字仅在 C++11 中引入,并且 google 测试框架是在它可用之前创建的,我假设 override
未在文档中使用,因为只是没有人费心去更新它。