我有一个几乎单值般类一样的人:嘲笑静态/全局函数的最简单方法?
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析构函数中被调用。
现在我试图单元测试我的人类,我需要一种方法来模拟/存根Destroy
方法。我想我可以在静态Destroy
函数中编写一个包装类,然后使用依赖注入将这个包装注入到Person类中,但似乎只是在这个简单的类上调用这个函数而已。什么是简单直接的方法来做到这一点?或者依赖注入真的是最好的方式吗?
更新
最终,我决定去创造一类包装的所有第三方库的全局函数,然后使用依赖注入到这个类传递到我的个人类的构造函数。这样我可以将Destroy方法留存。虽然person类只使用一个函数,但是库中的其他函数在我的代码中的其他位置被调用,并且因为我需要测试那些我将面对同一问题的函数。
我在我的主应用程序代码中创建了这个包装类的单个实例,并在需要时注入它。我选择走这条路,因为我认为它更清晰。我喜欢Billy ONeal的解决方案,我认为它解决了我的问题,但是我意识到如果我将代码保留几个月,然后再回过头来看看与依赖注入相比,发生什么事情需要更长的时间。我想起了蟒蛇格言的禅意:“显性比隐性更好”。我感觉依赖注入使得发生的事情更加明确。
刚刚创建静态/全局函数作为存根并调用它有什么问题? – littleadv
@littleadv:嗯,我刚刚进入单元测试,但我的理解是你不想修改你正在测试的类来测试它。所以,如果我正确理解你,通过创建一个存根Destroy方法并在我的Person类中使用它,我正在更改我的人员类,然后我必须以某种方式在测试版本和生产版本之间切换。 – User
@用户 - 不要修改您正在测试的类,而要将自己的'ThirdPartyClass'实现为存根。 – littleadv