Я пытаюсь написать макеты, используя amop . Я использую Visual Studio 2008.
У меня есть этот класс интерфейса:
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();
Это работает! Пока все хорошо, но что мне действительно нужно, так это boost :: 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();
Компилируется, но, очевидно, происходит сбой, поскольку в конце области видимости переменная 'mock' уничтожается дважды (из-за переменной стека 'mock' и shared_ptr).
Я также пытался создать переменную 'mock' в куче:
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();
Но это не работает, каким-то образом он входит в бесконечный цикл, прежде чем у меня возникла проблема с boost, когда я не нашел деструктор для смоделированного объекта, когда shared_ptr пытался удалить объект.
Кто-нибудь успешно использовал amop с boost :: shared_ptr?