【发布时间】:2018-11-08 12:51:10
【问题描述】:
我无法理解这一点:我有一个名为 MyClass 的类,它有一个 MyUsedClass 类型的私有成员。为了创建单元测试,我有一个 MyUsedClass 的模拟(模拟)版本。我想使用 MyUsedClass 的模拟私有成员或 MyUsedClass 的真正私有成员动态调用 MyClass。因为我要动态调用这个,所以使用#defines 和#ifdefs 是行不通的。
基本上我想做这样的事情:
class MyClass {
public:
MyClass(bool mock = false) {}; // Default bool to false.
~MyClass(void) {};
void DoSomething(void) { /* Do something with MyUsedObject here... */ };
void DoMore(void);
...
private:
if (mock) {
MyUsedClassMock MyUsedObject;
} else {
MyUsedClassReal MyUsedObject;
}
};
MyClass MyObject; // Create default instance with real MyUsedObject.
MyClass MyObject(true); // Create instance with the mock MyUsedObject.
但这当然行不通,因为不能在类的定义中使用 if 语句。
另一种方法是使用多态性并创建一个基类、一个真实类和一个模拟类。基类将拥有所有函数的所有实现,通过选择调用真实版本或模拟版本的 MyClass,我可以选择 MyUsedObject 的类型。
class MyClassBase {
public:
MyClassBase(void) {};
~MyClassBase(void) {};
void DoSomething(void) { /* Do something with MyUsedObject here... */ };
void DoMore(void);
...
private:
// No MyUsedObject in the Base class.
};
class MyClassReal : public MyClassBase {
public:
MyClassReal(void) {};
~MyClassReal(void) {};
private:
MyUsedClassReal MyUsedObject; // Here is MyUsedObject created, but then "Real".
};
class MyClassMock : public MyClassBase {
public:
MyClassMock(void) {};
~MyClassMock(void) {};
private:
MyUsedClassMock MyUsedObject; // Here is MyUsedObject created, but then "Mock".
};
MyClassReal MyObject; // Create instance with the real MyUsedObject.
MyClassMock MyObject; // Create instance with the mock MyUsedObject.
不幸的是,这也不起作用,因为 MyClassBase 函数实现对 MyUsedObject 还一无所知,所以我在这里遇到错误。一个想法是使用在基类中创建一个虚拟的 MyUsedObject,但这里的问题是基类还不知道对象的类型(真实或模拟)。此外,数据声明中也不允许使用“虚拟”,因此无论如何我尝试过之后都会遇到更多错误。
我在这里错过了什么?
【问题讨论】:
-
进一步研究的有用术语:“依赖注入”
-
谢谢。我查过那个。不知道那个词。
标签: c++ unit-testing types mocking private-members