Я пытаюсь написать mocks с помощью amop. Я использую Visual Studio 2008.Mocking using boost :: shared_ptr и AMOP
У меня есть этот интерфейс класса:
struct Interface {
virtual void Activate() = 0;
};
и этот другой класс, который принимает указатели на эту Interface
, как это:
struct UserOfInterface {
void execute(Interface* iface) {
iface->Activate();
}
};
Так я пытаюсь напишите код для тестирования следующим образом:
amop::TMockObject<Interface> mock;
mock.Method(&Interface::Activate).Count(1);
UserOfInterface user;
user.execute((Interface*)mock);
mock.Verifiy();
Он работает! До сих пор так хорошо, но то, что я действительно хочу, это повышение :: shared_ptr в методе Execute(), так что я пишу это:
struct UserOfInterface {
void execute(boost::shared_ptr<Interface> iface) {
iface->Activate();
}
};
Как следует тестовый код теперь? Я пробовал некоторые вещи, как:
amop::TMockObject<Interface> mock;
mock.Method(&Interface::Activate).Count(1);
UserOfInterface user;
boost::shared_ptr<Interface> mockAsPtr((Interface*)mock);
user.execute(mockAsPtr);
mock.Verifiy();
собирает, но, очевидно, выходит из строя, так как в конце области переменной «насмехаться» получает двойной уничтоженную (из-за переменную стеку «издеваться» и shared_ptr).
Я также пытался создать «макет» переменной в куче:
amop::TMockObject<Interface>* mock(new amop::TMockObject<Interface>);
mock->Method(&Interface::Activate).Count(1);
UserOfInterface user;
boost::shared_ptr<Interface> mockAsPtr((Interface*)*mock);
user.execute(mockAsPtr);
mock->Verifiy();
Но это не работает, как-то она входит в бесконечный цикл, прежде чем я имел проблемы с повышением не находя деструктор для издевающегося объекта, когда shared_ptr попытался удалить объект.
Кто-нибудь использовал amop с boost :: shared_ptr успешно?
Я попытался это, есть две проблемы: 1 подталкивание :: dynamic_pointer_cast является неудачная (всегда возвращает 0). 2- изменение кода следующим образом: amop :: TMockObject * mock = new amop :: TMockObject ; // Получить посмеянный интерфейс boost :: shared_ptr imock ((Interface *) * mock); Почти работает, но AMOP теперь не может найти методы, поэтому макет не работает. Я уверен, что amop не работает с shared_pointers (или они теряют ссылку, что-то вроде этого). –