尝试模拟纯虚拟课堂

Try to mock pure virtual class

本文关键字:虚拟 课堂 模拟      更新时间:2023-10-16

>i' 试图用谷歌模拟来模拟纯虚拟类中的函数。这是我的代码:

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:sourcegoogletestgooglemockincludegmockgmock-actions.h   1110        

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

来自Google Mock Cookbook:

SetArgPointee(( 方便地将值创建内部副本 传递给它,无需将值保持在范围内并处于活动状态。 但是,这意味着该值必须具有复制构造函数 和赋值运算符。

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