C++ 在C++;
我有一门课看起来有点像这样:C++ 在C++;,c++,unit-testing,constructor,mocking,abstract-class,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 { vir
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);
但是,当我尝试编译时,我得到的错误是没有定义classsiwanttotest(MockInput)方法。我试图为IInput
定义一个复制构造函数,该构造函数接受MockInput
,但是我得到了错误:隐式声明的IInput(const MockInput&)的定义
,因为我没有在类声明中定义该方法
然而,我宁愿避免在基类定义中声明复制构造函数,因为这意味着在我的生产代码中定义测试方法。(我意识到我可以通过使用IInput*
指针来解决这个问题,但如果可能的话,我也希望避免这种情况。)
我无法想象我是第一个尝试做到这一点的人,但我还没有找到如何做到这一点。有办法吗?如果是这样的话,你是如何做到的?试试动态投射:
RealInput theRealStuff; // RealInput : IInput
TheClassIWantToTest(dynamic_cast<const IInput&>(theRealStuff));
realcinput thealstuff;//RealInput:IInput
ClassiwantToTest(动态施法(Theralstaff));
叹息。。。事实证明,我想做的事情一开始确实是可能的。然而,由于一些愚蠢的原因,在这种特定情况下,我的实际类的名称不符合命名约定-您的提示帮助我找到了它不起作用的原因,但是classsiwanttotest(Theeralstuff)
实际上工作得很好。问题是我上了三节课B:A
和C:A
,并试图将B
转换为C
,而不是转换为A
,因为B
有一个名称,使我认为它是A
。澄清一下:问题是构造函数被定义为ClassisWantToTest(const RealInput&input)
而不是我在问题中指定的内容。将其更改为IInput
我最初尝试的一切都“正常”(TM)。