目前我正在尝试使用Google Mock框架(gtest)在我的C ++项目中实现一些基本的模拟。然而,这个框架并不是非常适合非虚拟方法,这需要一些,至少恕我直言,丑陋的解决方案(使用模板)。一个简单的解决方案当然是简单地使每个方法都是虚拟的,但框架建议不要这样做,这也不是我首选的解决方案。
所以,我开始思考,是否有办法在不更改实际源文件的情况下为测试声明每个虚拟方法?这可能是一个标志,将传递给编译器或一些CPP伏都教。如果这确实可行,那么这个解决方案的缺点是什么?
任何其他模拟非虚函数的方法(最好使用gtest / gmock)也很受欢迎。
如果这是相关的,我现在正在使用GCC和X-Code。
答案 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等)
如果这些不重要,并且您不介意将课程作为模板,那么您可以尝试这种方法。