Использование googlemock EXPECT _CALL с общим _ptr?

У меня есть тест, который отлично работает с необработанным указателем, но у меня возникли проблемы с его работой с 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());, я пока могу обойти эту проблему. Надеюсь получу ответ.

5
задан User 26 April 2012 в 23:00
поделиться