gpt4 book ai didi

c++ - 在不编辑生产代码的情况下在 C++ 中模拟非虚拟方法?

转载 作者:IT老高 更新时间:2023-10-28 21:57:41 28 4
gpt4 key购买 nike

我是一名相当新的软件开发人员,目前正在为多年前开始的现有 C++ 项目添加单元测试。由于非技术原因,我不允许修改任何现有代码。我所有模块的基类都有一堆设置/获取数据和与其他模块通信的方法。

由于我只想对每个单独的模块进行单元测试,因此我希望能够为我的所有模块间通信方法使用固定值。 IE。对于检查另一个模块是否处于事件状态的 Ping() 方法,我希望它根据我正在做的测试类型返回 true 或 false。我一直在研究 Google Test 和 Google Mock,它确实支持模拟非虚拟方法。然而,所描述的方法(http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods)要求我将原始方法“模板化”以获取真实或模拟对象。由于前面提到的要求,我不能在基类中模板化我的方法,所以我需要一些其他方法来模拟这些虚拟方法

基本上,我要模拟的方法在某个基类中,我要对其进行单元测试和创建模拟的模块是该基类的派生类。在我的基本 Module 类和我要测试的模块之间有中间模块。

如果有任何建议,我将不胜感激!

谢谢,

JW

编辑:更具体的例子

我的基类是rootModule,我要测试的模块是leafModule。有一个继承自rootModule的中间模块,leafModule继承自这个中间模块。

在我的leafModule 中,我想测试doStuff() 方法,该方法调用rootModule 类中定义的非虚拟GetStatus(moduleName)。我需要以某种方式使 GetStatus() 返回一个选定的 jar header value 。模拟对我来说是新事物,所以使用模拟对象是否是正确的方法?

最佳答案

有一些不同的方法可以替换非虚拟函数。一种是重新声明它们并为您想要测试的每组不同的非虚拟函数编译一个新的测试可执行文件。这很难扩展。

第二种选择是使它们虚拟化以进行测试。大多数编译器允许您在命令行上定义某些内容,因此请使用 -DTEST_VIRTUAL=virtual 或 -DTEST_VIRTUAL 编译您的代码,以根据代码是否在测试中使其成为虚拟或正常。

第三个可用的选项是使用一个模拟框架,让您模拟非虚拟函数。我是 HippoMocks 的作者(关于中立性等的免责声明),我们最近添加了在 X86 平台上模拟纯 C 函数的能力。这可以通过一些工作扩展到非虚拟成员函数,这就是您正在寻找的。请记住,如果您的编译器可以同时看到函数的使用和定义,那么它可能会内联它并且模拟可能会失败。这尤其适用于在 header 中定义的函数。

如果常规的 C 函数模拟对您来说已经足够了,您可以照原样使用它。

关于c++ - 在不编辑生产代码的情况下在 C++ 中模拟非虚拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2339558/

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