在C ++中将模拟对象转换为它们的抽象基类

时间:2014-03-07 11:46:06

标签: c++ unit-testing constructor mocking abstract-class

我的课程看起来有点像这样:

class TheClassIWantToTest {
public:
    TheClassIWantToTest(const IInput& input) {
        setLocalParameter(input.getParameter());
    }
    // other stuff, e.g. setLocalParameter, defined below
}

其中输入参数定义为

class IInput {
    virtual double getParameter() const = 0;
}

我还在我的系统中使用了IInput的实现,以及使用Google Mocks创建的模拟实现。

现在,我希望能够做类似

的事情
MockInput mock; // MockInput : IInput
TheClassIWantToTest sut(mock);

在我的测试中,在做

RealInput theRealStuff; // RealInput : IInput
TheClassIWantToTest(theRealStuff);

但是当我尝试编译时,我得到的错误是没有定义方法TheClassIWantToTest(MockInput)。我试图为IInput定义一个MockInput的复制构造函数,然后我得到error: definition of implicitly-declared IInput(const MockInput&),因为我没有在类声明中定义该方法。

但是,我宁愿避免在基类定义中声明复制构造函数,因为这意味着在我的生产代码中定义测试方法。 (我意识到我可以通过仅使用IInput*指针来解决这个问题,但如果可能的话,我也想避免使用它。)

我无法想象我是第一个尝试完成此任务的人,但我无法找到如何做到这一点。有办法吗?如果是这样,你怎么做?

1 个答案:

答案 0 :(得分:1)

尝试动态演员:

RealInput theRealStuff; // RealInput : IInput
TheClassIWantToTest(dynamic_cast<const IInput&>(theRealStuff));