2015-08-28 1 views
4

Dans toute la documentation sur gmock je trouve toujours l'objet fantaisie à instancier dans un test, comme ça:Google Mock: Est-il acceptable d'utiliser des objets fantaisie globaux?

TEST(Bim, Bam) 
{ 
    MyMockClass myMockObj; 
    EXPECT_CALL(MyMockObj, foo(_)); 
    ... 
} 

Ainsi, l'objet est créé et détruit par test. Je crois qu'il est également parfaitement possible de créer et de détruire l'objet par test . Mais je me demande si elle est aussi autorisé à avoir une instance de fichier global de l'objet fantaisie, comme ça:

MyMockClass myMockObj; 

TEST(Bim, Bam) 
{ 
    EXPECT_CALL(MyMockObj, foo(_)) 
    ... 
} 

Je l'ai essayé et je n'ai absolument aucun problème à ce jour, tout semble fonctionner très bien. Mais peut-être que je devrais être au courant de quelque chose? Juste parce que je suis tombé sur les this question, où la seule réponse précise:

... le problème est que vous instanciation d'une instance globale de FooMock. Googlemock/googletest s'attendent à ce que la maquette soit définie soit dans le corps du test, soit dans une classe de test.

Mais je n'ai rien trouvé dans la documentation ou ailleurs qui le confirme (l'ai-je oublié?).

Merci, Georg

PS: La raison pour laquelle je dois utiliser une instance globale simulée serait le sujet d'une autre discussion (voir this posting de la mine).

Répondre

2

Vous pouvez, mais ce n'est pas une bonne idée.

Faire une telle chose est en violation du principe d'isolation de UT. Cette violation peut entraîner une défaillance inattendue/réussite de vos tests.

Gtest utilise le destructeur des faux objets pour vérifier que l'attente s'est produite, c'est la raison derrière l'attente que chaque faux objet va créer et libérer dans le corps du test, ou dans une classe de fixture de test.

Si vous définissez le faux objet global, il ne sera pas libéré à la fin de chaque UT, la vérification ne s'exécutera pas et le test passera même en cas d'échec. plus sur certains de vos UT s peut fass/échouer lorsque vous exécutez tous vos tests ensemble; Dans un test, vous vous attendez à ce que la méthode x n'appelle pas et dans l'autre, vous vous attendez à ce que la méthode appelle; dans un UT vous attendez que la méthode x appelle 3 fois, mais la méthode a été appelée deux fois dans le test + une autre dans l'autre test (le test devrait échouer mais pas ...)

ne devrait jamais utiliser un simulacre global à moins que ce simulacre global ne soit utilisé que pour empêcher le pointeur nul (vous n'avez pas défini un comportement ..)