提问者:小点点

GMock施法到基地会失去模拟行为


使用一个库,我正在尝试在我的gtests中模拟它。

class MockScanOutcome : public Aws::DynamoDB::Model::ScanOutcome {
    public:
        MockScanOutcome() : Aws::DynamoDB::Model::ScanOutcome() {};
        MOCK_METHOD(bool, IsSuccess, (), (const));
};

其中基具有以下方法定义:

template<typename R, typename E> // Result, Error
class Outcome
{
    public:

        ...

        inline bool IsSuccess() const
        {
            return this->success;
        }
}

我在一个测试中运行了以下内容,但是结果是不相等的

Aws::DynamoDB::Model::ScanOutcome *so = dynamic_cast<Aws::DynamoDB::Model::ScanOutcome *>(m_outcome);
    
EXPECT_CALL(*m_outcome, IsSuccess).WillOnce(Return(true));

EXPECT_EQ(m_outcome, so); //fine
EXPECT_EQ(m_outcome -> IsSuccess(), true); //fine
EXPECT_EQ(so -> IsSuccess(), true); //error

如何重写基类中的const方法?


共1个答案

匿名用户

如果您的M_Outcome是指向mock类的指针,则结果是正确的。

EXPECT_CALL(*m_outcome, IsSuccess).WillOnce(Return(true));

需要在mock实例中进行调用,因此在调用expect_eq(m_output->issucess(),true);时是可以的。

Aws::DynamoDB::Model::ScanOutcome::IsSuccess

不是虚拟的,因此当从指向ScanOutcome的指针调用时,它将调用基类函数,该函数不在expect_call语句中,因此将返回ScanOutcome::success类成员中的任何值(可能是未初始化的值)