У меня есть тест, который отлично работает с необработанным указателем, но у меня возникли проблемы с его работой с std::shared_ptr
. Класс выглядит так:
class MyClass
{
MyClass(SomeService *service);
void DoIt();
}
Мой тестовый код похож на:
class MyClassTests : public ::testing::Test
{
public:
MyClassTests():
myClass_(new MyClass(&service_))
{}
protected:
SomeServiceFake service_;
MyClassSharedPointer myClass_;
};
TEST_F(MyClassTests, DoIt_DoesNotMeetCriteria_DoesNotPerformAction) {
// Arrange
EXPECT_CALL(service_, MeetsCriteria(_))
.WillRepeatedly(Return(false));
EXPECT_CALL(service_, PerformAction(_))
.Times(0);
// Act
myClass_->DoIt();
}
В этом тесте service_
— это макет/подделка, созданный в стеке во время теста, и я передаю адрес в конструктор MyClass
. Изменив MyClass
на service
как shared_ptr
, мой новый класс выглядит как:
class MyClass
{
MyClass(std::shared_ptr<SomeService> service);
DoIt();
}
То, что я пытаюсь сделать в своем тесте,:
class MyClassTests : public ::testing::Test
{
public:
MyClassTests():
myClass_(new MyClass(std::shared_ptr<SomeService>(&service_)))
{
}
...
Когда я делаю это, однако, тест терпит неудачу с:
Debug Assertion Failed!
Expression: _CtrlIsValidHeapPointer(pUserData)
В двух словах, мне нужен shared_ptr
- service_
(, который является фальшивым объектом )для передачи конструктору MyClass
, и мне нужен не -указатель для функции EXPECT_CALL
. Как я могу заставить это работать правильно?
ОБНОВЛЕНИЕ
Попытался динамически выделить SomeServiceFake для получения общего _ptr, а затем использовать оператор *для service_
, это дает мне «дальше», но теперь я получаю следующую ошибку:
error : this mock object
(used in test MyClassTests.DoIt_DoesNotMeetCriteria_DoesNotPerformAction)
should be deleted but never is. Its address is @009BBA68.
1>EXEC : error : 1 leaked mock object found at program exit.
ОБНОВЛЕНИЕ 2
Используя Mock::AllowLeak(service_.get());
, я пока могу обойти эту проблему. Надеюсь получу ответ.