代码之家  ›  专栏  ›  技术社区  ›  RafazZ

为什么在gtest中“SetUp”/“TearDown”是虚拟的?

  •  1
  • RafazZ  · 技术社区  · 7 年前

    googletest Primer SetUp / TearDown 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 回复  |  直到 7 年前
        1
  •  3
  •   el.pescado - нет войне    7 年前

    比两者都给定 SetUp TearDown 在父类中声明为虚,子类中的所有三个声明都是等价的:

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

    我会坚持使用 override ,如任何拼写错误(如 void setUp() override

    推翻 关键字只是在C++11中引入的,google测试框架是在它可用之前创建的,我假设 推翻 没有在文档中使用,因为根本没有人愿意更新它。

        2
  •  0
  •   Werner Erasmus    7 年前

    安装/拆卸是虚拟的。有人能解释为什么他们是虚拟的吗? 以下是《初级读物》中的一个逐字示例:

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

    我将覆盖以下内容(仅当我要添加其他行为时):

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

    或者(当不需要重写时),可以什么也不做,或者使用。。。

    using testing::TearDown; 
    

    ... 为了让类的用户清楚地了解TearDown是接口的一部分