【发布时间】:2011-01-21 07:49:14
【问题描述】:
我是一名相当新的软件开发人员,目前正在为多年前开始的现有 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() 返回一个选定的罐头值。模拟对我来说是新事物,所以使用模拟对象是否是正确的方法?
【问题讨论】:
-
你能在本地修改代码只为了你的测试吗?您不必签入更改。
-
你需要使用单元测试吗?还有其他(自动)回归测试方法。单元测试是一种工具,而不是一种宗教——如果它不适合,就不要使用它。
-
理想情况下,我的团队希望使用单元测试,因为我们的模块树相当大,我们真的希望将模块间功能的测试与模块本地方法的测试分离。不幸的是,我们之前的设计决策使单元测试成为了一个挑战。您指的是哪些其他回归测试方法?我想,使用其他测试方法,我们仍然需要某种方法来设置非虚拟方法或返回固定值,这意味着我们要么找到解决方法,要么保留另一个源代码树。
-
+1 用于 Google Mocks 食谱链接。我确实有这个问题,但是“模板化”方法已经成为我设计的一部分,所以听起来它对我来说可能是理想的。
标签: c++ unit-testing mocking googlemock