Я пытаюсь смоделировать интерфейс, используя HippoMock, для использования в классе, который использует указанный интерфейс. Я создаю фиктивный объект и настраиваю ExceptCallOverload, все компилируется нормально. Однако класс, который я тестирую, вызывает объект mock, который вызывает функцию mock :: NotImplemented.
Кроме того, процедуры, над которыми я издеваюсь, принимают ссылки на интерфейсы, но объекты, которые передаются в, хранятся в shared_ptr. Если я ограждаю .With и передаю объект shared_ptr, я получаю сообщение об ошибке: Comparer :: Compare не может соответствовать параметрам шаблона, это понятно. Так что, если я просто передам ссылку на интерфейс, я получу сообщение об ошибке, что невозможно создать чисто виртуальный класс.
Я чувствую, что это ставит меня между молотом и наковальней в отношении использования HippoMark.
маленький пример:
class objectA_interface
{
public:
virtual double getDouble() = 0;
};
class objectB_interface
{
public:
virtual double getDouble() = 0;
};
class test_interface
{
public:
virtual void fun(objectA_interface&) = 0;
virtual void fun(objectB_interface&) = 0;
};
void do_something()
{
std::shared_ptr<objectA_interface> objectA;
std::shared_ptr<objectB_interface> objectB;
MockRepository mocks;
test_interface* mock_interface = mocks.Mock<test_interface>();
//error C2259: 'object_interface' : cannot instantiate abstract class
mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectA_interface&))&test_interface::fun).With(*objectA);
mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectB_interface&))&test_interface::fun).With(*objectB);
//error C2665: 'HippoMocks::comparer<A>::compare' : none of the 2 overloads could convert all the argument types
mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectA_interface&))&test_interface::fun).With(objectA);
mocks.ExpectCallOverload(mock_interface, (void (test_interface::*)(objectB_interface&))&test_interface::fun).With(objectB);
}
Вы не можете передать shared_ptr в виде плоской ссылки на любую функцию. Это объясняет, почему второй вызов не работает — shared_ptr не является ссылкой.
Первый вызов должен работать, но он выглядит следующим образом. Он пытается сделать копию вашего объекта, а не использовать ссылку. Вы можете использовать Hippomocks :: byRef, чтобы явно указать, что он должен использовать это как ссылку, а не как копируемый экземпляр, чтобы он использовал вместо него ваш экземпляр. Это неявно приводит к вероятному сбою для временных пользователей, которые выходят за рамки до того, как произойдет фактический вызов.
Из тестового кода в test_ref_args.cpp ваш точный случай:
class IRefArg {
public:
virtual void test() = 0;
};
MockRepository mocks;
IK *iamock = mocks.Mock<IK>();
IRefArg *refArg = mocks.Mock<IRefArg>();
mocks.ExpectCall(iamock, IK::l).With(byRef(*refArg));
iamock->l(*refArg);