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, ожидания не оправдываются