2

我希望为我的 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。

4

1 回答 1

1

您可能可以在这里使用“ Typed Tests ”或“ Type-Parameterized Tests ”。

因此,例如,如果您删除TEST_F(BaseTest, ACommonTest) {}(因为这是您实例化 aBaseTest而不是从它派生的),您可以将其替换为:

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() {}
};
于 2013-11-05T22:49:29.273 回答