测试使用带有模板化方法的协作者的类

时间:2010-12-07 19:56:21

标签: c++ unit-testing templates

我喜欢模板方法可以为我做的事情,因为它们可以用来大大简化一些我不得不一遍又一遍地编写的代码。

但是,我很难测试任何依赖于具有公共模板方法的协作者的类。真正的问题是它们不能是虚拟的,所以我通常的子类化依赖关系和存根的方法不起作用。

目前,我的解决方案是创建一个非模板化界面,其中包含所支持的每种类型,然后使用模板作为实现细节。这是可测试的,但是对于通过许多类的大量类型进行更新是很繁琐的。我想我也可以重新设计使用基于继承的多态,但如果我的测试问题可以在没有系统重新设计的情况下解决,我宁愿这样做。

我认为使用模板专业化来改变测试库与生产库中的行为可能会有所作为,但我不确定这是否有效......甚至可能。

那么,测试在依赖项中使用模板化方法的类的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

Google mock framework提供了一种使用模板参数创建模拟的方法。然后你必须添加一个模板化的基类,并将一个模拟对象传递给被测试类的构造函数。

答案 1 :(得分:0)

我想进一步调查,所以我花了一些时间来尝试我想到的模板专业化解决方案。有可能做到这一点,但仍然是一个真正的痛苦。模板专业化的一大限制是必须在对模板进行任何引用之前完成。基本上,这意味着您必须在与生产代码相同的头文件中对测试中使用的任何类型进行模拟。这对于简单类型来说已经足够糟糕了,但对于其他库中的类来说可能很棘手或者不可能,因为需要在专门的类型中定义类型。

因此,我不认为模板特化是模拟单元测试函数的可行方法。使测试中的类成为模板并使用Google模拟生成模拟版本似乎是唯一合理的解决方案,而不是定义非模板接口。