1

假设是这种情况:

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()?

顺便说一下我是使用类工厂来初始化类的,所以实际情况可能会稍微复杂一些

谢谢~

4

1 回答 1

1

绝对可以按照您的描述进行操作,但这并不漂亮。一种方法是让模拟从具体类而不是接口派生,并创建模拟的子类,该子类将根据某些配置成员将方法调用分派给适当的超类。例如:

// 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;
};

然而,这需要另一个类,要求你的模拟从具体实现而不是接口继承,这会让大多数程序员想用勺子挖出他们的眼睛。与其使用这种可憎的方法,不如回顾一下您正在测试的类的设计,特别是寻找将其分解为单独对象的方法,每个对象都可以单独进行模拟。

于 2014-12-13T22:23:32.860 回答