Je suis un pionnier des efforts de tests unitaires dans mon entreprise et j'ai besoin de choisir un cadre de simulation à utiliser. Je n'ai jamais utilisé de framework moqueur auparavant. Nous avons déjà choisi Google Test, donc utiliser Google Mock serait bien. Cependant, mes premières impressions après avoir consulté tutoriel de Google Mock sont:
J'ai une grande confiance dans les développeurs de google et une faible confiance dans ma propre capacité à juger les frameworks fictifs, sans les avoir utilisés auparavant. Donc ma question est: Ces préoccupations sont-elles valables?
Ou n'y a-t-il pas de meilleure façon de définir un objet factice, et les appariements sont-ils intuitifs à utiliser dans la pratique? J'apprécierais les réponses de quiconque a déjà utilisé Google Mock, et des comparaisons avec d'autres cadres C++ seraient utiles.
Je l'utilise fréquemment.
C'est trivial de faire des choses relativement faciles, et possible de faire des choses très difficiles - c'est à peu près ce que je veux d'un cadre.
La partie la plus difficile à écrire des Matchers personnalisés (et d'autres choses) avec les simulations de Google n'est pas les simulations de Google, ce sont les erreurs de modèle de C++ ... elles sont presque impossibles à analyser. J'écris souvent des expressions complexes en construisant progressivement une expression de travail à partir de quelques expressions moins compliquées. De cette façon, les erreurs de modèle sont plus faciles à identifier.
Je n'ai pas vu de meilleure option pour se moquer de C++, et Google couvre beaucoup de terrain, donc je vous suggère de lui donner un coup de feu.
WRT le principe DRY, je suis d'accord que déclarer les méthodes simulées est malheureux, mais sans réflexion, je ne suis pas sûr que c ++ aurait beaucoup de chance sinon. Je suis presque certain s'il y avait un moyen , googlemock l'utiliserait;)
BTW: Le livre de cuisine googlemock est une bonne référence.
Fake-It est un cadre de simulation simple pour C++. FakeIt utilise les dernières fonctionnalités C++ 11 pour créer une API expressive (mais très simple). Avec FakeIt, il n'est pas nécessaire de redéclarer les méthodes ni de créer une classe dérivée pour chaque maquette. Voici comment vous fausses:
struct SomeInterface {
virtual int foo(int) = 0;
};
// That's all you have to do to create a mock.
Mock<SomeInterface> mock;
// Stub method mock.foo(any argument) to return 1.
When(Method(mock,foo)).Return(1);
// Fetch the SomeInterface instance from the mock.
SomeInterface &i = mock.get();
// Will print "1"
cout << i.foo(10);
Il existe de nombreuses autres fonctionnalités à explorer. Allez-y et essayez-le .
Avertissement: j'ai écrit HippoMocks.
Je peux recommander de regarder d'autres cadres moqueurs; il y en a une classe qui ne vous fait pas vous répéter. Ils suppriment également une nouvelle syntaxe pour faire correspondre votre code à beaucoup plus comme C++ combiné avec l'anglais. Essaie!
J'utilise googletest + googlemock professionnellement depuis quelques années, et j'aime vraiment ça. Une chose qui n'a pas été mentionnée par d'autres, c'est que si vous êtes déjà déterminé à utiliser googletest, il est très logique d'utiliser également googlemock. Ils sont assez bien intégrés et partagent un style et une philosophie de conception similaires, ce qui est agréable.
Par exemple, googlemock fournit des macros ASSERT_THAT()
qui sont super utiles et coexistent bien avec les assertions de googletests.
Je voudrais toutefois vous mettre en garde contre l'abus du pouvoir de googlemock. Il peut être extrêmement tentant d'écrire des matchers très complexes et puissants qui finissent par être totalement illisibles. Vous avez juste besoin d'être discipliné lors de son utilisation.
Quelques autres réflexions: