gpt4 book ai didi

c++ - 声明所有虚拟方法以使用 gtest 进行模拟?

转载 作者:太空宇宙 更新时间:2023-11-04 12:55:22 24 4
gpt4 key购买 nike

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

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

模拟非虚函数的任何其他方法(尽管最好使用 gtest/gmock),也值得赞赏。

如果相关的话,我目前正在使用 GCC 和 X-Code。

最佳答案

获取虚函数只有两种方式:

  • 声明它是虚拟的

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

第一个可以显式完成或通过宏完成,但这会导致代码难看。第二个可以用模板基来完成,它通常默认为空的东西,但为了测试目的,你用一个镜像你的接口(interface)但声明函数为虚拟的类来实例化它。

struct Empty { };

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

做作但足以表明意图。您可以将上面的代码用于代码的普通非虚拟用法。然后,对于您的测试:

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

YourClass<YourClassTester> testable;

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

  • 类(class)规模更大 (vtbl)

  • 内存布局不同

  • RTTI 支持在测试中有效,但在生产中无效

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

如果这些都不重要,并且您不介意将类设为模板,则可以尝试这种方法。

关于c++ - 声明所有虚拟方法以使用 gtest 进行模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46916330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com