#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调用Method()
时,我想使用上面的代码调用Mock
类的o.UseOrigMethod();
。我已尝试在object
中声明Mock
UseMethodMock
个班级但仍使用Orig
的对象。
有什么方法可以欺骗编译器并在Mock
类中调用Method
时调用object.Method()
UseMethod
吗?
我可以更改Mock
和UseMethodMock
类中的代码,但不能更改其他类中的代码。
答案 0 :(得分:2)
修改代码以使其更易于测试是没有羞耻的,所以也许你可以重新考虑。在这种情况下:
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
类型),一般来说我会强烈建议反对它。
答案 1 :(得分:0)
因为你称之为orig的方法。您应该覆盖UseMethodMock类中的useOrigMethod()。
答案 2 :(得分:0)
你只需要将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 . . .