假设情况如此:
class base()
{
virtual func1()=0;
virtual func2()=0;
virtual func3()=0;
}
class Inheritance:public base
{
virtual func1(){ func2(); func3() };
virtual func2(){ /* do something */ };
virtual func3(){ /* do something */ };
}
现在我想单元测试func1(),并模拟func2()和func3();
因此可以模拟func2()和func3(),而func1()知道调用mock-func2()和mock-func3()而不调用真正的func2()和func3()?
顺便说一句,我使用Class Factory来初始化类,所以真实案例可能会更复杂一些
感谢〜
答案 0 :(得分:1)
绝对有可能做你所描述的,但它并不漂亮。一种方法是让mock从具体类而不是接口派生,并创建mock的子类,它将根据某些配置成员将方法调用分派给适当的超类。例如:
// class MockBase inherits from BaseImpl, which in turn inherits from
// the 'base' interface
class Dispatch : public MockBase {
public:
void func1() {
return useMockFunc1 ? MockBase::func1() : BaseImpl::func1();
}
bool useMockFunc1;
};
然而,这还需要另一个类,强制你的模拟继承了具体的实现而不是接口,这会让大多数程序员想要用勺子挖出他们的眼睛。可能值得回顾一下你正在测试的类的设计,特别是寻找将它分解为单独对象的方法,而不是使用这种憎恶,每个对象都可以单独模拟。