c++ - 您如何设计 C++ 应用程序才能使模拟对象最易于使用?

标签 c++ mocking

我从未使用测试驱动开发进行过开发,也从未使用模拟对象进行单元测试。我总是对不包含应用程序其他方面的简单对象进行单元测试,然后转向不太简单的对象,这些对象仅引用已经过单元测试的对象。这往往会进行到最终的“单元”测试是组件测试。

使用了哪些设计技术可以尽可能轻松地用 Mock 对象替换内部类?

例如,在我的代码中,我会将 myDataClass 的头文件包含在 myWorkerClass 中。 myDataClass 由 myWorkerClass 构造,其生命周期与 myWorkerClass 绑定(bind)。您如何设置它以便在硬连线包含时包含模拟的 myDataClass?

最佳答案

初学者的答案是:

  • 在测试类中不要使用实际的 模拟的类型,使用它 界面
  • 测试时提供 模拟对象的另一种实现 界面
//Common header
class ObjectInterface {
public:
  virtual void doThings()=0;
};

//Release
class RealObject: public ObjectInterface {
public:
  virtual void doThings(){
    //Complicated work here
  }
};

//Testing 
class MockedObject: public ObjectInterface {
public:
  virtual void doThings(){
    //Not so complicated work here
  }
};

//Common header
class TestedClass {
public:
  void useObject(ObjectInterface & object) {
    object->doThings();
  }
};


//Unit test
TestedClass toTest;
MockedObject mockedObject;
toTest.useObject(mockedObject);

关于c++ - 您如何设计 C++ 应用程序才能使模拟对象最易于使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421277/

相关文章:

c++ - 动态和静态分配的数组元素计算?

c++ - 设置 PATH 变量不起作用

c++ - 更好地理解 C++ 中的 Singleton 类

c++ - 传递一个类成员函数作为函数参数

Java 测试验证构造函数

java - SNMP4J 如何模拟 GETBULK 请求?

c++ - boost 野兽 websocket 连接关闭处理程序

python - 修补 Python 模拟中函数调用中的一处出现

java - JMockit MockUp 可以模拟 toString() 吗?

javascript - Jasmine 模拟 Angular $http - 错误 : describe does not expect a done parameter