我希望为我的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。
答案 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() {}
};