在基类方法中调用不同类的方法
Call a method of a different class in base class method
#include <iostream>
using namespace std;
//can't modify it
class Orig{
public:
void Method(){
cout << "I am original method";
}
};
class Mock{
public:
void Method(){
cout << "I am mock method";
}
};
//can't modify it
class UseMethod{
Orig object;
public:
void UseOrigMethod(){
object.Method();
}
};
class UseMethodMock : public UseMethod{
//some code
};
int main()
{
UseMethodMock o;
o.UseOrigMethod();
}
当我从 main 调用o.UseOrigMethod();
时,我想使用上面的代码调用Mock
类的Method()
。我尝试在UseMethodMock
中声明Mock
类的object
,但它仍然使用Orig
的对象。
有什么方法可以欺骗编译器并在Mock
UseMethod
类中调用object.Method()
时调用Method
?
我可以更改Mock
类和UseMethodMock
类中的代码,但不能更改其他类中的代码。
修改代码以使其更易于测试并不可耻,所以也许你可以重新考虑。在这种情况下:
- 通过使
Orig
方法虚拟化来准备继承。
通过 - 构造函数将
Orig
实例注入到UseMethod
中(注意切片 - 通过指针或引用传递(。 - 让
Mock
继承Orig
并覆盖虚拟方法。
如果虚拟调用的性能是一个问题,请在编译时完成所有操作:
- 使
UseMethod
成为模板,该模板将Orig
类型作为模板参数。 - 在生产代码中,使用
UseMethod<Orig>
. - 在测试代码中,使用
UseMethod<Mock>
.
如果你真的,绝对,肯定可以肯定,肯定不能修改Orig
和UseMethod
,你可以滥用预处理器:
#include "Orig.h"
#define Orig Mock
#include "UseMethod.h"
#undef Orig
当然,这伴随着一大堆警告(最值得注意的是,它假设UseMethod.cpp
没有明确提到Orig
类型(,总的来说,我强烈建议不要这样做。
因为你调用了 orig 的方法。你应该在UseMethodMock类中覆盖useOrigMethod((。
你只需要将UseMethod类Orig对象更改为Moke对象,我将给出预期的输出,这意味着称为Moke类的方法。
法典:
#include <iostream>
using namespace std;
//can't modify it
class Orig{
public:
void Method(){
cout << "I am original method";
}
};
class Mock{
public:
void Method(){
cout << "I am mock method";
}
};
//can't modify it
class UseMethod{
//need to change here Orig to Moke
Mock object;
public:
void UseOrigMethod(){
object.Method();
}
};
class UseMethodMock : public UseMethod{
//some code
};
int main()
{
UseMethodMock o;
o.UseOrigMethod();
}
输出
I am mock method
--------------------------------
Process exited after 0.006435 seconds with return value 0
Press any key to continue . . .
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 对具有相同方法的不同类使用一个变量
- 在基类方法中调用不同类的方法
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- 指向不同类方法的函数指针
- 如何设置仅对派生于不同类的类可见的方法
- 如何在不同类的容器上使用多态方法
- C++将动态方法指针作为不同类的方法参数传递
- 在线程中运行来自不同类的方法
- 如何合并使用私有成员的不同类的相同方法
- 多线程——在不同类的方法之间传递变量
- 获取访问不同类中的顶级变量和方法
- 不同类中的多个j2me commandAction方法没有响应