2017-09-28 2 views
1

j'ai une classe qui a une méthode qui accepte des arguments variables:GMOCK une méthode d'accepter des arguments variables

class MyClass 
{ 
public: 
virtual void myprint(const char* format, ...) = 0; 
}; 

je tentais de se moquer de la classe au-dessus

class Mock : public MyClass 
{ 
public: 
MOCK_METHOD1(myprint, void (const char* format, ...)); 
} 

Mais il donne mes problèmes de compilation :

error: 'Result' in 'struct testing::internal::Function<void(const char*, ...)>' does not name a type 
    MOCK_METHOD1(myprint, void (const char* format, ...)); 
^
error: incomplete type 'testing::internal::Function<void(const char*, ...)>' used in nested name specifier 
error: incomplete type 'testing::internal::Function<void(const char*, ...)>' used in nested name specifier 
error: template argument 1 is invalid 
error: field 'gmock1_print_15' has incomplete type 'testing::internal::FunctionMocker<void(const char*, ...)>' 

Comment puis-je moquer une méthode qui prend des arguments variables comme paramètre?

Répondre

1

Malheureusement, vous cannot directly mock a variadic function in Gmock:

Vous ne pouvez pas se moquer d'une fonction variadique (à savoir une fonction qui prend des arguments de (...)) directement dans Google Mock.

Le problème est qu'en général, un objet fantaisie n'a aucun moyen de savoir combien d'arguments sont passés à la méthode variadique et quels sont les types d'arguments. Seul l'auteur de la classe de base connaît le protocole, et nous ne pouvons pas regarder dans sa tête. Par conséquent, pour se moquer d'une telle fonction, l'utilisateur doit apprendre à l'objet simulé comment calculer le nombre d'arguments et leurs types. Une façon de le faire est de fournir des versions surchargées de la fonction.

Les arguments Ellipsis sont hérités de C et pas vraiment une fonctionnalité C++. Ils sont dangereux à utiliser et ne fonctionnent pas avec les arguments qui ont des constructeurs ou des destructeurs. Par conséquent, nous recommandons de les éviter en C++ autant que possible.

Cependant, Nemelis sur le SO a suggéré some workaround que vous pouvez utiliser pour y parvenir. Il implique le traitement de votre argument format avec tous les arguments variadiques pour créer une seule chaîne message, puis en se moquant d'une fonction qui prend message en tant qu'argument unique.

+0

Merci pour les pointeurs - il a résolu mon problème – Prakash