Kann Google Mock eine Methode mit einem smart-pointer zurück geben?
Ich habe eine Fabrik, die gibt einen smart-pointer. Unabhängig davon, was intelligente Zeiger, die ich benutze, ich bekomme keine Google-Mock mock die factory-Methode.
Dem mock-Objekt ist die Implementierung einer rein abstrakten Schnittstelle, wo alle Methoden sind virtual. Ich habe ein Vorbild:
MOCK_METHOD0(Create, std::unique_ptr<IMyObjectThing>());
Und ich bekomme:
"...gmock/gmock-spec-builders.h(1314): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'"
Art wies in der smart-pointer definiert ist.
Bekommen und habe es versucht, Zugang zu einem der Konstruktoren deklariert private, aber ich verstehe nicht warum. Bei dieser wurde ein std::auto_ptr, der Fehler sagte, es war kein copy-Konstruktor, die mich verwirrt.
Sowieso, gibt es eine Möglichkeit, zu Verhöhnen, eine Methode, die zurückgibt einen smart-pointer? Oder gibt es einen besseren Weg, um eine Fabrik zu bauen? Meiner ist nur zu lösen, um wieder eine raw-pointer (blech...)?
Meinem Umfeld ist Visual Studio 2010 Ultimate und Windows 7. Ich bin nicht mit CLI.
InformationsquelleAutor Matthew Reddington | 2011-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Google Mock erfordert Parameter und Rückgabewerte verspottet Methoden kopierbar, in den meisten Fällen. Pro boost-Dokumentation, unique_ptr ist nicht kopierbar. Sie haben eine Möglichkeit, wieder einer der smart-pointer-Klassen mit gemeinsamem Besitz (shared_ptr, linked_ptr, etc.) und somit kopierbar. Oder Sie können ein raw-pointer. Da die Methode in der Frage ist offenbar die Methode, die Konstruktion eines Objekts, sehe ich kein problem mit der Rückgabe einer raw-pointer. So lange, wie ordnen Sie das Ergebnis auf einen freigegebenen Zeiger bei jedem Anruf Website, Sie gehen in Ordnung zu sein.
Es scheint nicht akzeptabel zu mir für eine factory-Klasse, um wieder eine raw-pointer. In diesem Fall ist ein unique_ptr am meisten Sinn macht. Es wurde entwickelt zum Teil zu lösen das problem der "weisen das Ergebnis auf einen freigegebenen Zeiger auf jeden call Website."
Ich glaube nicht, dass dies ist die richtige Antwort, die alles verändert, um raw-oder Miteigentum ist nicht die Lösung, nur um Dinge zu testen!
InformationsquelleAutor VladLosev
Einen gangbaren workaround für google mock-framework Probleme mit nicht (const) kopierbar Funktionsargumente und-retun-Werte ist die Verwendung von proxy-mock-Methoden.
Angenommen, Sie haben die folgende interface-definition (ob es guter Stil verwenden
std::unique_ptr
auf diese Weise scheint mehr oder weniger eine philosophische Frage, ich persönlich mag es, zu erzwingen, Eigentumsübergang):Den entsprechenden mock-Klasse könnte wie folgt definiert:
Brauchen Sie nur darauf zu achten, dass die Konfigurationen (Aktionen) für die
nonCopyableReturnProxy()
Methode wieder entwederNULL
oder einer Instanz zugeordnet dynamisch auf dem heap.Gibt es eine google-mock-user-forum-thread über dieses Thema, wo einer der Betreuer besagt, dass die google-mock-framework nicht verändert werden, um diese Unterstützung in Zukunft argumentieren, dass Ihre Politik wird dringend davon abgeraten, die Verwendung
std::auto_ptr
Parameter. Wie erwähnt, dies ist IMHO eine philosophische Sicht, und die Möglichkeiten des mocking framework sollte nicht lenken, welche Art von Schnittstellen, die Sie gestalten wollen, oder Sie können die Verwendung von 3rd-party-APIs.Wie gesagt, die Antwort beschreibt einen machbar Abhilfe.
auto_ptr
von-Wert ist ein schlechter plan (und oh wow, ist es, wie die meisten Dinge, die umliegendenauto_ptr
): aber die Frage oben ist überunique_ptr
keine?Das ist, weil ich habe mit
std::auto_ptr
in meinem eigentlichen Testfälle, aber das gleiche Prinzip funktioniert fürstd::unique_ptr
als gut. Was denkst du, sollte ich Bearbeiten Sie die Frage entsprechend?Nur dieses bit: "diese Art der Verwendung von smart-pointer-Parameter" -- die starke Entmutigung ist über
auto_ptr
Parameter, geschrieben in 2010 vor, um die Existenz vonunique_ptr
. Ändern Sie den Rahmen, so dassauto_ptr
in der Lage sein, krank zu sein -, ist eine ziemlich akzeptable position: nachunique_ptr
ist auf der Szene ist ein anderer Kessel der Fische. Wenn Sie untersuchen die Gründe, warum Sie entlassenauto_ptr
als angemessene parameter geben, gelten Sie nicht fürunique_ptr
.Diese Problemumgehung kann auch helfen, wenn Sie versuchen, zu verspotten, die eine Funktion zurückgibt, die ein
std::future
.Für Vollständigkeit, ein link zur Lösung der Rückgabetyp der proxy durch die Einstellung einer Fabrik, um zu vermeiden Erzeugung nullptr unique_ptr nur
InformationsquelleAutor πάντα ῥεῖ
Ich weiß, dieser post war von vor langer Zeit, so haben Sie wahrscheinlich entdeckt, die Antwort jetzt.
gmock bisher nicht unterstützt mock Funktionen, dass wieder alle movable type, einschließlich der smart-Pointer. Jedoch, im April 2017, gmock eingeführt eine neue Aktion modifier
ByMove
.EXPECT_CALL(*foo_, Bar(_, )).WillOnce(Return(ByMove(some_move_only_object)));
wo some_move_only_object werden können, z.B. ein
std::unique_ptr.
So, ja, jetzt gmock können mock eine Funktion, eine smart-pointer.
InformationsquelleAutor jeff