【问题标题】:Cast mock objects to their abstract base class in C++将模拟对象转换为 C++ 中的抽象基类
【发布时间】:2014-03-07 11:46:06
【问题描述】:

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

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* 指针来解决这个问题,但如果可能的话,我也想避免这种情况。)

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

【问题讨论】:

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


    【解决方案1】:

    尝试动态转换:

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

    【讨论】:

    • 叹息...原来我试图做的事情一开始真的是可能的。但是,由于一些愚蠢的原因,在这种特定情况下,我的实际类的名称不符合命名约定 - 您的提示帮助我找出了它为什么不起作用,但 TheClassIWantToTest(theRealStuff) 实际上工作得很好。结果问题出在我上三门课。 B : AC : A,并试图将B 转换为C 而不是A,因为B 的名字让我觉得它是A...
    • 澄清一下:问题在于构造函数被定义为TheClassIWantToTest(const RealInput&amp; input),而不是我在问题中指定的。将其更改为 IInput 我最初尝试的所有内容都“正常工作”(TM)。
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 2011-12-27
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2014-10-13
    • 2015-12-14
    相关资源
    最近更新 更多