我的代码结构如下:
namespace A{
class baseClass{
template<typename t> static ::boost::shared_ptr<t> create_obj();
};
}
namespace A{
namespace B{
class DerivedClass1 : public baseClass {
void create_obj(){...};
}
}
}
namespace A{
namespace C{
class DerivedClass2 : public baseClass {
void create_obj(){...};
}
}
}
有一个基类和大约5-6个派生类,它们都在不同的命名空间中。我正在尝试使用google测试框架为create_obj()编写测试,使用类型参数化测试,因为需要为所有派生类测试方法。我的测试代码是:
#include "gtest/gtest.h"
#include "baseClass.h"
#include "DerivedClass1.h"
#include "DerivedClass2.h"
using namespace A;
using namespace B;
using namespace C;
template<typename T> class sample_test : public ::testing::Test
{
protected:
boost::shared_ptr<TypeParam> = create_obj();
};
TYPED_TEST_CASE_P(sample_test);
TYPED_TEST_P(sample_test, firstTest)
{
//do some testing
}
REGISTER_TYPED_TEST_CASE_P(sample_test, firstTest);
typedef ::testing::Types<DerivedClass1, DerivedClass2> tTypes;
INSTANTIATE_TYPED_TEST_CASE_P(mytest, sample_test, tTypes);
此代码提供了一些模板错误,因为它不知道要调用哪个create_obj()。
所以我试图在我的测试中编写一个switch case或if-else场景,它将从正确的命名空间调用方法。像
这样的东西 template<typename T> class sample_test : public ::testing::Test
{
protected:
switch(T)
{
case DerivedClass1:
//Call method like A::B::create_obj()
case DerivedClass2:
//Call method like A::C::create_obj()
}
};
但我显然不能在交换机情况下甚至在if-else schenario中将T作为参数。有没有办法实现这个目标?
P.S:非常抱歉,但我无法在线发布代码。我希望这就足够了。答案 0 :(得分:0)
根据您发布的代码判断,您可以通过在注册类型时直接指定命名空间来修复测试代码,如下所示:
typedef ::testing::Types<A::B::DerivedClass1, A::C::DerivedClass2> tTypes;
但是,由于你没有发布MCVE,我不能100%确定它会起作用。如果没有,您可以使用类型特征在编译期间区分不同类型:
if (std::is_same<T, A::B::DerivedClass1>::value)
//Call method like A::B::create_obj()
else if (std::is_same<T, A::C::DerivedClass2>::value)
//Call method like A::C::create_obj()
...
有关详细信息,请参阅文档:http://en.cppreference.com/w/cpp/types/is_same
答案 1 :(得分:0)
我不知道为什么但是std :: is_same都不是boost :: is_same。两者都给出了编译错误&#34;语法错误:if语句&#34;。但最终起作用的是@Ulrich Eckhardt提出的以下代码
template<typename T> class sample_test : public ::testing::Test
{
protected:
boost::shared_ptr<T> testObj;
testObject = T::create_obj();
};