为什么`setUp` /`TearDown`在gtest中是虚拟的?

时间:2017-08-22 02:49:02

标签: c++ c++11 googletest

googletest Primer中,有一个示例,其中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());
}

2 个答案:

答案 0 :(得分:2)

鉴于父类中的SetUpTearDown都被声明为虚拟,子类中的所有三个声明都是等价的:

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是界面的一部分