我是一个相当新的软件开发人员目前正在该开始几年前添加单元测试现有的C ++项目。由于非技术原因,我不能修改任何现有的代码。基类所有的模块都有一堆用于设置/获取数据并与其它模块进行通讯的方法。

由于我只想单元测试每个单独模块,我希望能够使用罐头值对于所有我的模块间通信的方法。即针对检查另一个模块是活动的,我想拥有它基于什么样的测试,我做回真或假的方法坪()。我一直在寻找到谷歌测试和谷歌模拟,并且它支持嘲讽非虚方法。然而该方法描述( http://code.google.com/p/googlemock/维基/菜谱#Mocking_Nonvirtual_Methods )要求我“模板化”的原始方法采取在真实或模拟对象。我不能去,我的模板化基类中的方法,由于前面提到的要求,所以我需要嘲笑这些虚拟方法的一些其他的方式。

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

我将不胜感激任何意见!

谢谢,

JW

修改:一个更具体的例子

我的基类是可以说rootModule,以测试我想要的模块是leafModule。有一个中间模块从rootModule它继承,从该中间模块leafModule继承。

在我的leafModule,我要测试的doStuff()方法,它调用在rootModule类中定义的非虚拟的getStatus(MODULENAME)。我需要以某种方式的getStatus做()返回选定罐头值。嘲讽的是新的给我,所以使用模拟对象,甚至是正确的做法?

有帮助吗?

解决方案

我会写一个Perl /红宝石/ Python脚本在原来的源树来读取和在不同的目录写出一个嘲笑源树。你不必完全分析C ++,以便更换一个函数定义。

其他提示

有取代非虚函数的一些不同方式。一是重新申报他们并编译一个新的测试可执行文件为每个不同的组非虚函数,你想测试。这是几乎没有可扩展的。

一个第二个选择是使它们的虚拟测试。大多数编译器允许您定义的命令行东西,所以编译-DTEST_VIRTUAL =虚拟或-DTEST_VIRTUAL你的代码,使他们无论是虚拟还是正常取决于它是否是测试还是不行。

其可以是可用是使用模拟框架,让你嘲笑非虚拟函数的第三个选项。我HippoMocks的作者(免责声明关于中立等),我们最近添加了嘲笑在x86平台上简单的C函数的能力。这可以扩展到非虚成员函数与一些工作,并会是你在找什么。请记住,如果你的编译器可以同时看到和使用在同一时间,它可能是内联和嘲讽可能失败的一个函数的定义。特别是适用于在标头中定义的功能。

如果常规的C函数嘲笑够你,你可以使用它,因为它是现在。

的一种方法将是为测试指定不同的来源。说你的生产目标使用rootModule.h和rootModule.cpp。使用您的测试目标不同的来源。您可以指定通过改变include路径不同的页眉,这样的#include“rootModule.h”实际负载单元测试/ rootModule.h。然后模拟rootModule你的心脏的内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top