Google Mock и SetArgPointee с использованием объектов

Я недавно использую GMock, и я не могу успешно использовать SetArgPointee в следующем коде.

class rox{
public :
    int a, b;
    rox(){}
    rox(const rox &ana){
        a = ana.a;
        b = ana.b;
    }
    rox operator=(const rox& ana){
        a = ana.a;
        b = ana.b;
        return *this;
    }
};

TEST(Statistics, RandomReceived){
    MockClass ms; 
    rox ana1, ana2;
    EXPECT_CALL(ms, Read(_)).Times(1).WillOnce(DoAll(SetArgPointee<0>(ana1), Return(1)));
    ms.Read(&ana2);
    EXPECT_EQ(ana2.a, ana1.a);
    EXPECT_EQ(ana2.b, ana1.b);
}

Тест не пройден, поскольку объект ana2 после вызова функции чтения не имеет должным образом установленных полей a и b. Используя часы в VS, я вижу ana2.a и ana2.b значения мусора.

Я прочитал в кулинарной книге GMock, мне также нужен конструктор копирования и оператор присваивания. Если я использую отладчик, я вижу, что конструктор копирования вызывается 4 раза, а оператор присваивания никогда не вызывается.

Кто-нибудь может указать здесь ошибку? Что мне нужно сделать, чтобы получить после чтения в ana2 тот же объект, что и ana1?

1 ответ

Решение

SetArgPointee не работает с полиморфными объектами:) Если подпись Read - int Read(ARox *ana); и ARox является абстрактным классом, а rox наследуется от ARox, ожидания не оправдываются

Другие вопросы по тегам