À 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
Vous devez vous connecter pour publier un commentaire.
Définir votre classe de test plus comme ceci:
et votre test:
C'est une regrettable lacune de gmock - il n'a vraiment pas jouer gentil avec les pointeurs intelligents. Je suppose que ton code est un peu plus complexe que ce que vous avez posté ici? Il existe quelques façons dont gmock peut donner un faux positif sur un objet de fuite géré par un pointeur intelligent (voir, par exemple, ici). Sans le code c'est difficile de dire pourquoi gmock rapports de la fuite.
OriginalL'auteur Fraser
Cela n'a rien à voir avec le framework de test. Comme vous l'avez dit vous-même, vous êtes la création d'un shared_ptr à partir d'une pile de objet alloué (c'est à dire un automatique de la durée de vie). Cela ne fait pas de sens. Partagé les pointeurs sont généralement créés à partir de la suite de
new
. Vous pourriez être en mesure de le faire fonctionner si vous passez une coutume Deleter que le second argument de la shared_ptr constructeur, mais le meilleur peut-être de créer l'objet en utilisant de nouveaux.new
SomeServiceFake
, je crois googlemock attend les objets de la classe pour laEXPECT_CALL
, comment puis-je y parvenir?Utilisateur: Peut-être dire que *service_ pour obtenir la référence et le passer à EXPECT_CALL? @VJovic: je ne comprends pas votre commentaire.
OriginalL'auteur John Zwinck