Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当函数互相调用时,如何在同一个类中锁定函数_C++_Gmock - Fatal编程技术网

C++ 当函数互相调用时,如何在同一个类中锁定函数

C++ 当函数互相调用时,如何在同一个类中锁定函数,c++,gmock,C++,Gmock,假设情况如下: 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 */ }; }

假设情况如下:

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

那么,当func1()知道调用mock-func2()和mock-func3()而不调用真正的func2()和func3()时,是否可以模拟func2()和func3()

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


谢谢~

你所描述的肯定是可以做到的,但这并不漂亮。一种方法是让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;
};

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

完全可以按照您所描述的做,但这并不漂亮。一种方法是让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;
};
然而,这还需要另一个类,要求您的mock继承自具体实现而不是接口,这将使大多数程序员想用勺子挖他们的眼睛。与其使用这种讨厌的东西,不如回顾一下您正在测试的类的设计,特别是寻找将其分解为单独对象的方法,每个对象都可以单独模拟