【问题标题】:Try to mock pure virtual class尝试模拟纯虚拟类
【发布时间】:2018-03-14 10:31:43
【问题描述】:

我试图用 google mock 在纯虚拟类中模拟一个函数。这是我的代码:

class I_Circle

{

private :

public: 

    virtual ~I_Circle() {}

    virtual void GetClone(I_Circle * k) = 0;
};


class Mock_I_Circle : public I_Circle
{
public:
    Mock_I_Circle() {}
    virtual ~Mock_I_Circle() {};

    MOCK_METHOD1(GetClone, void(I_Circle* k));

};

TEST(CircleTest, secondTest) {
    NiceMock<Mock_I_Circle> iCircle;
    Mock_I_Circle* pICircle = &iCircle;

    EXPECT_CALL(iCircle, GetClone(_))
        .WillOnce(
            SetArgPointee<0>(*pICircle)
        );

    iCircle.GetClone(pICircle);

    Mock::VerifyAndClear(&iCircle);
}

使用此实现,我收到以下错误:

Error   C2280   'testing::PolymorphicAction<testing::internal::SetArgumentPointeeAction<0,Mock_I_Circle,false>>::PolymorphicAction(const testing::PolymorphicAction<testing::internal::SetArgumentPointeeAction<0,Mock_I_Circle,false>> &)': attempting to reference a deleted function MockInterface   c:\source\googletest\googlemock\include\gmock\gmock-actions.h   1110        

这里要删除什么函数?问题似乎是由带有 SetArgPointee 的 EXPECT_CALL 引起的,但我不知道它有什么问题。

【问题讨论】:

  • 这个测试毫无意义,因为你正在尝试测试你的模拟类,而不是真正的实现。请阅读有关测试和模拟类的一般信息。
  • 这显然是正确的,但我尽量让示例保持简单。

标签: c++ googletest googlemock


【解决方案1】:

来自Google Mock Cookbook

SetArgPointee() 可以方便地制作您的值的内部副本 传递给它,无需将值保持在范围内并保持活动状态。 然而,这意味着该值必须具有复制构造函数 和赋值运算符。

在您的情况下,Mock_I_Circle 类缺少复制构造函数和赋值运算符。添加这些将修复编译错误。话虽如此,我不清楚你写的测试的目的。

【讨论】:

  • 您的提示只是修复了这个错误。但是我们的代码仍然不是我们所期望的。但是对于上面的示例代码,进一步说明没有意义,但感谢您的帮助。
  • 我们现在的经验是,标准构造函数被调用一次,复制构造函数被调用3次。这对我来说似乎很奇怪。
猜你喜欢
  • 1970-01-01
  • 2013-10-07
  • 2010-11-21
  • 1970-01-01
  • 2016-10-21
  • 2015-12-09
相关资源
最近更新 更多