Mit googlemock EXPECT_CALL mit shared_ptr?

Habe ich ein test, der funktioniert mit einem raw-pointer, aber ich habe Probleme dabei, es funktioniert mit einem std::shared_ptr. Die Klasse ist wie folgt:

class MyClass
{
    MyClass(SomeService *service);
    void DoIt();
}

Mein test-code ist wie:

    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();
}

In diesem test service_ ist ein mock/fake erstellt, die auf dem stack der test und ich gebe die Adresse in den Konstruktor von MyClass. Ändern MyClass zu nehmen service als shared_ptr meine neue Klasse sieht wie folgt aus:

class MyClass
{
    MyClass(std::shared_ptr<SomeService> service);
    DoIt();
}

Was ich versuche in meinem test:

    class MyClassTests : public ::testing::Test
    {
    public:
        MyClassTests():
            myClass_(new MyClass(std::shared_ptr<SomeService>(&service_)))
        {

        }
            ...

Wenn ich dies tun, aber der test schlägt fehl mit:

Debug Assertion Failed!
Expression: _CtrlIsValidHeapPointer(pUserData)

Kurz gesagt, ich brauche eine shared_ptr zu service_ (das ist ein fake-Objekt) zu übergeben, um die MyClass Konstruktor, und ich brauche eine nicht-Zeiger für die EXPECT_CALL Funktion. Wie bekomme ich diese zu arbeiten, richtig?

UPDATE

Versucht die dynamische Zuweisung von SomeServiceFake, um die shared_ptr und dann mit der * - operator auf service_ wird mir "weiter", aber jetzt bekomme ich die folgende Fehlermeldung:

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.

UPDATE 2

Mit Mock::AllowLeak(service_.get()); so, die ich bekommen kann, um dieses problem für jetzt. Hoffentlich werde ich eine Antwort bekommen.

InformationsquelleAutor User | 2012-04-26

Schreibe einen Kommentar