2017-08-25 2 views
0

Ich habe eine Klasse mit einem geschützten Copykonstruktor:Google Mock und geschützt Copykonstruktor

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

    std::vector<Thing> things; 

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

ich eine andere Klasse haben die Verwendungen dieses:

class AnotherThing 
{ 
public: 
    AnotherThing() 
    { 
    } 

    virtual ~AnotherThing() {} 

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

und ein Mock-Version dieser Klasse:

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

ich möchte mit einem echten Argument dieser Methode DoListThing nennen eine echte Liste zu liefern:

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

    list.things.push_back(Thing()); 

    EXPECT_CALL(anotherThing, DoListThing(list)); 

    anotherThing.DoListThing(list); 
} 

Ich erhalte einen Fehler dieser Zusammenstellung:

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

Doch wenn ich einen nicht-Mock machen nennt es funktioniert gut:

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

Wenn im Mock Test, den ich mit rufen '_', es funktioniert:

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

    list.things.push_back(Thing()); 

    EXPECT_CALL(anotherThing, DoListThing(_)); 

    anotherThing.DoListThing(list); 
} 

Wie kann ich jedoch ein Liste in diesem Fall? Wenn die Liste von DoListThing zurückgegeben wurde, könnte ich Return verwenden, aber was mache ich für ein Argument, das so geändert wird?

Antwort

0

Ich konnte nicht an einem geschützten Kopierkonstruktor vorbeikommen, daher war meine Antwort, eine gefälschte (Dummy-) Version einer Klasse zu erstellen und Google Mock zu ignorieren. Das funktionierte gut genug, um die betreffende Klasse zu testen. Das Beispiel, das ich hier vorgestellt habe, ist eine vereinfachte Version des größeren Pakets.