G锁定铸造到基础上会释放模拟行为

GMock casting to base looses mock behaviour

本文关键字:释放 模拟 基础上 锁定      更新时间:2023-10-16

使用一个库,我正试图在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方法?

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

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

需要在mock实例中进行调用,因此在调用EXPECT_EQ(m_outcome -> IsSuccess(), true);时可以。

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

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