为什么"设置"/"拆解"在 gtest 中是虚拟的?

Why are `SetUp`/`TearDown` virtual in gtest?

本文关键字:quot 虚拟 拆解 设置 为什么 gtest      更新时间:2023-10-16

googletest入门中,有一个例子,其中SetUp/TearDownvirtual。有人可以解释他们为什么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());
}

假设SetUpTearDown在父类中都声明为虚拟,子类中的所有三个声明都是等效的:

virtual void SetUp() {}
void SetUp() {}
void SetUp() override {}

我会坚持使用override,因为任何拼写错误(如void setUp() override(都会导致编译错误。

由于override关键字仅在 C++11 中引入,并且 google 测试框架是在它可用之前创建的,因此我认为override不会在文档中使用,因为根本没有人费心更新它。

在googletest 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 {}

使成员函数虚拟并受保护意味着在需要时可以覆盖成员(自定义(,但也意味着在基本成员中有一些必需的实现。如果确实选择重写,则应调用基方法。基类 Test 中的 virtual 关键字指示存在多态扩展的范围。

我会覆盖如下(仅当我有其他行为要添加时(:

...
void TearDown() override
{
//Call base TearDown - important
Test::TearDown();
//... My code
}
...

或者(当不需要覆盖时(,可以什么都不做,或者使用...

using testing::TearDown; 

。向类用户明确说明拆解是界面的一部分