C ++中的虚拟方法,无需编辑生产代码?

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

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

基本上,我想模拟的方法是在一些基类中,我想单元测试和创建模块的模块是该基类的派生类。 在我的基本模块类和我想测试的模块之间有中间模块。

我将不胜感激任何建议!

谢谢,

JW

编辑:一个更具体的例子

我的基类是让我们说rootModule,我想测试的模块是leafModule。 有一个从rootModule继承的中间模块,leafModule继承自这个中间模块。

在我的leafModule中,我想测试doStuff()方法,该方法调用rootModule类中定义的非虚拟GetStatus(moduleName)。 我需要以某种方式使GetStatus()返回一个选定的罐头值。 嘲笑对我来说是新的,所以使用模拟对象甚至是正确的方法?


我会编写一个Perl / Ruby / Python脚本来读取原始源代码树,并在另一个目录中写出一个模拟的源代码树。 您不必完全解析C ++来替换函数定义。


有一些替换非虚函数的方法。 一种是重新声明它们并为每个你想测试的不同的非虚函数集合编译一个新的测试可执行文件。 这几乎不可扩展。

第二个选择是让它们成为虚拟的测试。 大多数编译器允许你在命令行上定义一些东西,所以用-DTEST_VIRTUAL = virtual或-DTEST_VIRTUAL编译你的代码,使它们成为虚拟或正常,取决于它是否处于测试中。

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

如果常规的C函数嘲笑对你来说足够了,你可以像现在这样使用它。


一种方法是指定不同的测试来源。 假设您的生产目标使用rootModule.h和rootModule.cpp。 为测试目标使用不同的来源。 您可以通过更改包含路径来指定不同的头文件,这样#include“rootModule.h”实际上会加载unittest / rootModule.h。 然后将rootmodule模拟到你心中的内容。

链接地址: http://www.djcxy.com/p/27913.html

上一篇: virtual methods in C++ without editing production code?

下一篇: How to make mock to void methods with mockito