2017-08-25 5 views
0

j'ai une classe avec un constructeur protégé contre la copie:Google Mock et constructeur protégé contre la copie

class ThingList 
{ 
public: 
    ThingList() {} 
    virtual ~ThingList() {} 

    std::vector<Thing> things; 

protected: 
    ThingList(const ThingList &copy) {} 
}; 

J'ai une autre classe les usages celui-ci:

class AnotherThing 
{ 
public: 
    AnotherThing() 
    { 
    } 

    virtual ~AnotherThing() {} 

    void DoListThing(const ThingList &list) 
    { 
    } 
}; 

et une version Mock de cette classe:

class MockAnotherThing : public AnotherThing 
{ 
public: 
    MOCK_METHOD1(DoListThing, void(const ThingList &list)); 
}; 

Je veux appeler cette méthode DoListThing avec un vrai argument pour fournir une liste réelle:

TEST(Thing, DoSomeThingList) 
{ 
    MockThing thing; 
    ThingList list; 
    MockAnotherThing anotherThing; 

    list.things.push_back(Thing()); 

    EXPECT_CALL(anotherThing, DoListThing(list)); 

    anotherThing.DoListThing(list); 
} 

je reçois une erreur de compilation ceci:

1>..\mockit\googletest\googlemock\include\gmock\gmock-matchers.h(3746): error C2248: 'ThingList::ThingList': cannot access protected member declared in class 'ThingList' 

Pourtant, si je fais un appel, il fonctionne non Mock très bien:

ThingList list; 
AnotherThing theRealThing; 
theRealThing.DoListThing(list); 

Si dans le test de simulation j'appelle avec '_', cela fonctionne:

TEST(Thing, DoSomeThingList) 
{ 
    MockThing thing; 
    ThingList list; 
    MockAnotherThing anotherThing; 

    list.things.push_back(Thing()); 

    EXPECT_CALL(anotherThing, DoListThing(_)); 

    anotherThing.DoListThing(list); 
} 

Cependant, comment puis-je passer un liste dans ce cas? Si la liste a été retournée par DoListThing, je pourrais utiliser Return mais qu'est-ce que je fais pour un argument qui est modifié comme ceci?

Répondre

0

Je n'ai pas réussi à dépasser un constructeur de copie protégé alors ma réponse a été de créer une fausse version (factice) d'une classe et d'ignorer Google Mock. Cela a fonctionné assez bien pour moi pour tester la classe en question. L'exemple que j'ai fourni ici est une version simplifiée du plus gros paquet.