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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren Sie Ihre test-Klasse eher so:
und Ihr test:
Dies ist eine unglückliche Nachteil der gmock - es ist wirklich nicht spielen schön mit smart Pointer. Ich denke mal dein code ist etwas komplexer als das was du gepostet hast hier? Es gibt ein paar Möglichkeiten, in denen gmock geben kann, eine falsch-positiv-über eine undichte Objekt verwaltet von einem smart-pointer (siehe z.B. hier). Ohne den code ist es schwer zu sagen, warum gmock Berichte das Leck.
InformationsquelleAutor Fraser
Dies hat nichts zu tun mit dem test-framework. Wie du selbst sagtest, sind Sie die Schaffung eines shared_ptr von einem stack-Objekt zugeordnet (also automatische Lebensdauer). Dies ist jedoch nicht sinnvoll. Shared-Pointer sind in der Regel erstellt aus dem Ergebnis der
new
. Sie könnten in der Lage sein, es zu schaffen, wenn Sie passieren einen custom Deleter als zweites argument an den Konstruktor von shared_ptr, aber am besten vielleicht einfach das Objekt erstellen mit neuen.new
SomeServiceFake
, ich glaube googlemock erwartet, dass class-Objekte für dieEXPECT_CALL
, wie kann ich das erreichen?User: Vielleicht sagen *service_ zu Holen Sie sich die Referenz-und übergeben, EXPECT_CALL? @VJovic: ich verstehe nicht, Ihren Kommentar.
InformationsquelleAutor John Zwinck