命名空间冲突的类型参数化测试

时间:2018-03-19 10:35:02

标签: c++ googletest type-parameter

我的代码结构如下:

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:非常抱歉,但我无法在线发布代码。我希望这就足够了。

2 个答案:

答案 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();
};