c++ - 如何使用谷歌测试测试实现接口(interface)的不同类/结构?

标签 c++ googletest

我正在尝试使用谷歌测试中可用的类型化测试概念。这个概念的描述符合我打算做的事情,但我无法完全理解。我想测试实现接口(interface)的结构,因为它们曾经完全不同,所以需要使用不同的值/实例对其进行初始化。

简单的我的代码如下

struct Serializable
{
    virtual sObj serialize() = 0;
    virtual void unserialize(sObj) = 0;
};

struct s1 : serializable
{
  int attrI1;
  int attrI2;
  sObj serialize()
  {
    //serialize an instance of this struct
  }
  void unserialize(sObj)
  {
    //unserialize data to instance of this struct
  }
}

struct s2 : serializable
{
  char attrC;
  void serialize()
  {
    //serialize an instance of this struct
  }
  sObj unserialize()
  {
    //unserialize data to instance of this struct
  }
}

我想用不同的实例/值测试 s1 和 s2。测试应如下所示:

template <typename T>
int testSerialzable(T& t)
{
  sObj obj = t.pack();

  T temp; 
  TEST_EQ(temp.unpack(obj), t); 
}

有人可以告诉我这是否可行以及如何实现吗? 非常感谢

最佳答案

我终于明白了。对于我上面的例子。它将像:

template<class T>
struct TestSerializable : public ::testing::Test
{
    static T serializedType;
};

TYPED_TEST_CASE_P(TestSerializable);

TYPED_TEST_P(TestSerializable, serializationTest)
{
  sObj obj = t.serialize();

  TypeParam temp; 
  ASSERT_EQ(temp.unserialize(obj), t); 
}

REGISTER_TYPED_TEST_CASE_P(TestSerializable, serializationTest);


typedef ::testing::Types<s1, s2> MyTypes;
INSTANTIATE_TYPED_TEST_CASE_P(MySerialiInstantiation, TestSerializable, MyTypes);


template<> s1 TestSerializable<s1>::serializedType(/*instance of s1 with proper values*/s1());
template<> s2 TestSerializable<s2>::serializedType(/*instance of s1 with proper values*/s2());

关于c++ - 如何使用谷歌测试测试实现接口(interface)的不同类/结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115181/

相关文章:

googletest - gtest 在模拟方法中期望参数

C++11 线程不加入

c++ - 什么会使 C++ RTTI 不受欢迎?

c++ - 幻影类型是否与原始类型具有相同的对齐方式?

c++ - gtest 期望无序元素带有自定义比较器/匹配器

c++ - Google 测试中的 EXPECT_NO_DEATH()

c++ - 在单元测试时如何模拟基类的非重写、虚拟/非虚拟方法?

gmock 可以用于 stub C 函数吗?

c++ - 减少 OpenMP 中的数组

c++ - 将 dopri5 与 odeint boost 库一起使用