c++ - 不可实例化的谷歌测试夹具父类(super class)

标签 c++ unit-testing googletest

我希望为我的 Google 测试装置定义一个不可实例化的父类(super class)。 父类(super class)将初始化成员并进行一些默认测试。 子类将扩展父类(super class),并有特定的测试。

下面是基类:

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。

最佳答案

您可以在这里使用“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() {}
};

关于c++ - 不可实例化的谷歌测试夹具父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19775188/

相关文章:

c++ - 将边添加到 Openmesh 网格

C++ REG_SZ 加值失败

php - Laravel 单元测试(响应不是 View )

c++ - 谷歌模拟 : leaked mock object found at program exit?

c++ - 获取 C/C++ 中打印的最后一个字符串

c++ - 使用 "using"关键字继承基类的复制和移动构造函数

c++ - boost::filesystem 的段错误

java - 如何将模拟对象注入(inject)到构造函数中?

c# - 单元测试 - 如何比较两个分页集合以断言所有项目不同?

c++ - 使用gtest时“_main already defined”