【发布时间】:2011-09-26 09:34:29
【问题描述】:
我有一个简单的几乎类似于价值的类,比如 Person:
class Person
{
public:
Person(ThirdPartyClass *object);
virtual ~Person(void);
virtual std::string GetFullName() const;
virtual int GetAge() const;
virtual int GetNumberOfDaysTillBirthday() const;
};
我正在使用第三方库,ThirdPartyClass 需要调用一个名为 Destroy(第三方库的一部分)的全局/静态函数来销毁它。这个 Destroy 函数在 Person 析构函数中被调用。
现在我正在尝试对我的 Person 类进行单元测试,我需要一种方法来模拟/存根 Destroy 方法。我想我可以围绕静态 Destroy 函数编写一个包装器类,然后使用依赖注入将此包装器注入到 Person 类中,但这样做似乎只是为了在这个简单的类上调用这个函数而过分。有什么简单直接的方法可以做到这一点?或者依赖注入真的是最好的方法吗?
更新
最终我决定创建一个包含所有 3rd 方库的全局函数的类,然后使用依赖注入将这个类传递给我的 person 类的构造函数。这样我就可以去掉 Destroy 方法。虽然 person 类只使用一个函数,但库的其他函数在我的代码中的其他点被调用,并且当我需要测试这些函数时,我将面临同样的问题。
我在我的主应用程序代码中创建了这个包装类的一个实例,并在需要的地方注入它。我选择走这条路线,因为我认为它更清晰。我喜欢 Billy ONeal 的解决方案,我认为它回答了我的问题,但我意识到如果我将代码保留几个月然后回来,与依赖注入相比,我需要更长的时间才能弄清楚发生了什么。我想起了 Python 格言中的禅宗“显式胜于隐式”。而且我觉得依赖注入使正在发生的事情更加明确。
【问题讨论】:
-
只创建一个静态/全局函数作为存根并调用它有什么问题?
-
@littleadv:嗯,我刚刚开始进行单元测试,但我的理解是你不想修改你正在测试的类来测试它。因此,如果我理解正确,通过创建一个存根 Destroy 方法并在我的 Person 类中使用它,我正在更改我的 person 类,然后我必须以某种方式在测试版本和生产版本之间切换。
-
@User - 不要修改你正在测试的类,实现你自己的
ThirdPartyClass作为存根。 -
@littleadv:我已经使用 googlemock 删除了
ThirdPartyClass,但ThirdPartyClass需要调用Destroy进行清理。 -
@littleadv:我不关注你。 Destroy 是一个全局/静态函数,它在 Person 类的析构函数中被调用(就像我写的那样)。
标签: c++ unit-testing function mocking static-functions