使用gtest声明所有方法虚拟用于模拟?

时间:2017-10-24 17:12:00

标签: c++ gcc mocking virtual googletest

目前我正在尝试使用Google Mock框架(gtest)在我的C ++项目中实现一些基本的模拟。然而,这个框架并不是非常适合非虚拟方法,这需要一些,至少恕我直言,丑陋的解决方案(使用模板)。一个简单的解决方案当然是简单地使每个方法都是虚拟的,但框架建议不要这样做,这也不是我首选的解决方案。

所以,我开始思考,是否有办法在不更改实际源文件的情况下为测试声明每个虚拟方法?这可能是一个标志,将传递给编译器或一些CPP伏都教。如果这确实可行,那么这个解决方案的缺点是什么?

任何其他模拟非虚函数的方法(最好使用gtest / gmock)也很受欢迎。

如果这是相关的,我现在正在使用GCC和X-Code。

1 个答案:

答案 0 :(得分:0)

获得虚拟功能的方法只有两种:

  • 宣布虚拟

  • 继承它(来自具有相同名称,相同签名,虚函数的基类。)

第一个可以通过显式或通过宏来完成,但这会产生丑陋的代码。 第二个可以使用模板库来完成,模板库通常默认为空的,但出于测试目的,您可以使用镜像接口的类来实例化它,但将函数声明为虚拟。

struct Empty { };

template <class BaseT = Empty>
class YourClass : public BaseT {
public:
    void foo();
};

已经过了,但足以表明意图。您可以将上述内容用于代码的普通,非虚拟用法。然后,为了你的测试:

struct YourClassTester {
    virtual void foo() = 0;
    virtual ~YourClassBase() { }
};

YourClass<YourClassTester> testable;

等。当然,这确实意味着您正在测试不同于实际使用的代码,并且可能存在可检测的差异,例如:

  • 班级规模较大(vtbl)

  • 内存布局不同

  • RTTI支持在测试中有效,而非在生产中

  • 某些类型特征结果也可能不同,具体取决于原始类别类别(is_standard_layout,is_pod,is_trivially_copyable等)

如果这些不重要,并且您不介意将课程作为模板,那么您可以尝试这种方法。