不可实例化的Google测试夹具超级

时间:2013-11-04 19:09:18

标签: c++ unit-testing googletest

我希望为我的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 个答案:

答案 0 :(得分: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() {}
};