Приведение GMock к базе теряет фиктивное поведение - PullRequest
0 голосов
/ 14 июля 2020

Используя библиотеку, и я пытаюсь имитировать ее в своих 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 Ответ

1 голос
/ 14 июля 2020

Если ваш m_outcome является указателем на класс mock, результат правильный.

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

Ожидает вызова в экземпляре mock, поэтому при вызове * 1007 это нормально *.

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

не является виртуальным, поэтому при вызове из указателя на ScanOutcome он вызывает функцию базового класса, которой нет в операторе EXPECT_CALL, и, таким образом, вернет все, что находится в ScanOutcome::success член класса (вероятно, неинициализированное значение).

...