在c ++中模拟非类方法

时间:2014-11-07 07:31:34

标签: c++ unit-testing

我正在尝试在遗留应用程序中重构代码并遇到代码看起来像这样的情况

namespace DB
{
    void GetDataBase(IDataBase** db);
}

有很多不同的地方可以调用它,我想测试这些方法但是替换返回的结果。我可以使用某种设计来正确地模拟这个吗?

我拥有的是这个,但它看起来不是一个好方法,虽然它有效

namespace DB
{
    void GetDataBase(IDataBase** db);
    void SetTestDataBase(IDataBase* db);
}

还有很多其他类似的情况,我很想知道如何改进它。

1 个答案:

答案 0 :(得分:1)

你建议的方式没问题,但它污染了测试代码,你可能需要更多这样的方法。另请注意,如果启动了静态变量并使用此功能,则可能无效。

我建议做的是两者之一 -

  1. 清理代码,这不是一个具有大量依赖关系的复杂功能,您可以轻松地将其更改为简单的工厂调用。为了避免遍历使用它的所有函数,您可以创建一个为您执行此操作的宏。然后工厂可以使用#ifndef语句来确定采用模拟或真实代码的天气。 (使用define语句编译测试代码,不使用生成代码编译测试代码)
  2. 您可以在链接时替换实现。编译生产代码时,将其与实际实现相关联;但是当你编译测试时,将它与你的模拟链接以返回你喜欢的对象。
  3. 两种方法都确保在main之前调用的静态方法都没有使用你想要模拟的get方法。