gtest类型参数化的多态性
Polymorphism for gtest type parameterized
我试图使用gtest类型参数化,以确保我的类的基本功能。然而,我被困在测试设置。示例如下:
我有两个类叫做catest &DogTest,以及一个名为AnimalTest的基类,它将测试Cat &狗:
template <typename T>
class AnimalTest : public ::testing::Test
{
public:
virtual void SetUp()
{
// Do something here so that it will call the correct setup
}
};
TYPED_TEST_P( AnimalTest , HasLegs )
{
ASSERT_EQ( 4, this->Legs );
}
REGISTER_TYPED_TEST_CASE_P( AnimalTest , HasLegs );
现在在我的CatTest.cpp中,我声明了以下宏(与DogTest相同)
typedef ::testing::Types< Cat > AnimalsTypes;
INSTANTIATE_TYPED_TEST_CASE_P( CatTest, AnimalTest , AnimalsTypes );
class CatTest : public CatSetUp
, public AnimalTest< AnimalsTypes >
{
public:
virtual void SetUp()
{
CatSetUp::SetUp();
}
}
在一个正常的类型参数化测试示例中,HasLegs测试将同时运行Cat和Dog类型。这里的问题是ctest有自己的SetUp(), DogTest()也是如此。这些需要执行,以便初始化Cat对象,以便将其传递给类型参数化的测试(Animal测试)。然而,这些SetUp从来没有被调用过,事实上,甚至连DogTest()或ctest()的构造函数也从来没有被调用过。我认为类型参数化测试将调用派生类的相应实例与重写SetUp() ?还是我遗漏了什么?
不能将测试类作为被测试对象。
我的意思是被测试对象应该是你的测试类的成员(聚合,而不是继承)-然后一切都变得简单:
template <typename T>
class AnimalTest : public ::testing::Test
{
public:
T objectUnderTest; // animal
virtual void SetUp()
{
objectUnderTest.SetUp();
}
};
TYPED_TEST_P( AnimalTest , HasLegs )
{
ASSERT_EQ( 4, objectUnderTest.Legs );
}
REGISTER_TYPED_TEST_CASE_P( AnimalTest , HasLegs );
typedef ::testing::Types< Cat, Dog > AnimalsTypes;
INSTANTIATE_TYPED_TEST_CASE_P( AnimalWithFourLegs, AnimalTest , AnimalsTypes );
说明
然而这些SetUp从来不会被调用,事实上甚至是构造函数未调用DogTest()或ctest()。
很简单。
INSTANTIATE_TYPED_TEST_CASE_P
的第一个参数不是类名-它只是描述第三个参数的某个名称-因此您将知道哪个测试是哪个。说INSTANTIATE_TYPED_TEST_CASE_P( CatTest, AnimalTest , AnimalsTypes );
并不意味着它与CatTest
类有任何关系…读gtest-doc。
相关文章:
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 如何调用指针类型的方法(禁用多态性)?
- 如何为多态性中的指定类型分配内存
- C 多态性:允许模棱两可的成员类型
- 在多态性中重新定义功能(虚拟),具有不同数量的参数
- 如何避免使用模板类型的派生类进行多态性动态强制转换
- 具有不同参数的多态性
- 自动复制=按值并支持多态性的适当类型的非静态字段
- 具有不同模板类型的子类的多态性
- 多态性并获取C++中的对象类型
- 多态性(继承)和价值类型
- C++技术:类型擦除与纯多态性
- 具有 dynamic_cast 和类型标识的 C++ 多态性
- 多态性和类型转换
- 多态性不适用于相同数据类型(Base和Inherited类)的函数返回值
- 为什么说C++不支持参数多态性
- 具有非类型模板参数的多态性
- 成员变量多态性和参数引用
- 使用谷物在库中序列化模板化的多态性类型
- gtest类型参数化的多态性