- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是一名相当新的软件开发人员,目前正在为多年前开始的现有 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/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!