À l'aide de googlemock EXPECT_CALL avec shared_ptr?

J'ai un test qui fonctionne très bien avec un pointeur brut, mais je vais avoir des problèmes à la faire fonctionner avec un std::shared_ptr. La classe est comme ceci:

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

Mon code de test est comme:

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

Dans ce test, service_ s'agit d'une maquette/faux créé sur la pile dans le test et je vous passe l'adresse dans le constructeur de MyClass. Changer MyClass de prendre service comme un shared_ptr, ma nouvelle classe ressemble à:

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

Ce que j'essaie dans mon test est:

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

        }
            ...

Quand je fais ceci, cependant, le test échoue avec un:

Debug Assertion Failed!
Expression: _CtrlIsValidHeapPointer(pUserData)

En un mot, j'ai besoin d'un shared_ptr à service_ (qui est un faux objet) à passer à l' MyClass constructeur et j'ai besoin d'un non-pointeur pour le EXPECT_CALL fonction. Comment puis-je obtenir que cela fonctionne correctement?

Mise à JOUR

Essayé allouer dynamiquement SomeServiceFake pour obtenir le shared_ptr et puis, à l'aide de l'opérateur * sur service_, cela me met "en outre" mais maintenant, je reçois l'erreur suivante:

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.

Mise à JOUR 2

À l'aide de Mock::AllowLeak(service_.get()); donc je peux contourner ce problème pour l'instant. J'espère que je vais obtenir une réponse.

OriginalL'auteur User | 2012-04-26