在基类方法

时间:2017-08-22 08:45:05

标签: c++

#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吗?

我可以更改MockUseMethodMock类中的代码,但不能更改其他类中的代码。

3 个答案:

答案 0 :(得分:2)

修改代码以使其更易于测试是没有羞耻的,所以也许你可以重新考虑。在这种情况下:

  1. 通过使其方法成为虚拟来准备Orig继承。
  2. 通过其构造函数将Orig实例注入UseMethod(注意切片 - 通过指针或引用传递)。
  3. Mock继承自Orig并覆盖虚拟方法。
  4. 如果需要考虑虚拟调用的性能,请在编译时完成所有操作:

    1. 使UseMethod成为模板,将Orig的类型作为模板参数。
    2. 在生产代码中,使用UseMethod<Orig>
    3. 在测试代码中,使用UseMethod<Mock>
    4. 如果你真的,绝对,肯定肯定,当然不能修改OrigUseMethod,你可以滥用预处理器:

      #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 . . .