2013-11-04 36 views
2

我希望爲我的Google測試夾具定義一個不可實例化的超類。 超級會初始化成員並進行一些默認測試。 子類將擴展超類,並進行特定的測試。不可實例化的Google測試夾具超類

以下是基類:

class BaseTest : public ::testing::Test 
{ 
protected: 
    BaseTest(...) {} // constructor with args to setup members 

    void SetUp() {} // sets up the internals 
}; 

TEST_F(BaseTest, ACommonTest) {} // common test case 

派生類:

class DerivedTest : public BaseTest 
public: 
    DerivedTest() : BaseTest(...) {} // default no args constructor 

    void SetUp() { BaseTest::SetUp(); } 
}; 

TEST_F(DerivedTest, ASpecificTest) {} // specific test case 

我要的是測試不實例化BaseTest,而不是實例 的DerivedTest並同時調用方法,ACommonTest和ASpecificTest。

它現在在做什麼,是實例化BaseTest並在其上運行 ACommonTest。然後實例化DerivedTest並運行ASpecificTest。

回答

1

您可以在這裏使用「Typed Tests」或「Type-Parameterized Tests」。

因此,例如,如果您刪除TEST_F(BaseTest, ACommonTest) {}(因爲這是你實例化一個BaseTest,而不是一個由它派生的),你可以將其替換爲:

template <typename T> 
class DerivedCommonTest : public BaseTest { 
public: 
    DerivedCommonTest() : BaseTest() {} 
    virtual void SetUp() { BaseTest::SetUp(); } 
}; 

typedef ::testing::Types<Foo, Bar> MyTypes; 
TYPED_TEST_CASE(DerivedCommonTest, MyTypes); 

TYPED_TEST(DerivedCommonTest, ACommonTest) {} // common test case 

如果你真的想使BaseTest非可實例化,您可以爲其添加純虛函數,然後針對每種派生類型實施它:

class BaseTest : public ::testing::Test { 
protected: 
    BaseTest() {} // constructor with args to setup members 
    virtual void SetUp() {} // sets up the internals 
    virtual void PureVirtual() = 0; 
}; 

... 

template <typename T> 
class DerivedCommonTest : public BaseTest { 
public: 
    DerivedCommonTest() : BaseTest() {} 
    virtual void SetUp() { BaseTest::SetUp(); } 
    virtual void PureVirtual() {} 
}; 

...  

class DerivedTest : public BaseTest { 
public: 
    DerivedTest() : BaseTest(...) {} // default no args constructor 
    virtual void SetUp() { BaseTest::SetUp(); } 
    virtual void PureVirtual() {} 
}; 
相關問題