GMock ne compile pas - GTEST_EXCLUSIVE_LOCK_REQUIRED ne semble pas être défini
-
23-12-2019 - |
Question
J'essaie de créer une classe simple et simulée
#include "interpolation.hpp"
#include <gtest/gtest.h>
#include <gmock/gmock.h>
class MockInterp1D : public Interp1DBase {
public:
MOCK_METHOD1(evaluateAt, double(double));
MOCK_METHOD2(evaluateAt, double(double, int));
};
basé sur la classe de base suivante
class Interp1DBase {
public:
virtual double evaluateAt(double) const = 0;
virtual double evaluateAt(double, int) const = 0;
virtual ~Interp1DBase() { };
};
en utilisant Google Mocks.Lorsque j'essaie de compiler les tests où cette simulation est utilisée, j'obtiens l'erreur suivante :
In file included from /usr/include/gmock/gmock-generated-function-mockers.h:43:0,
from /usr/include/gmock/gmock.h:61,
from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/interpolation/interpolation-mocks.hpp:4,
from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/physics/B-field-tests.hpp:6,
from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/physics/B-field-tests.cpp:2:
/usr/include/gmock/gmock-spec-builders.h:134:41: error: expected ‘;’ at end of member declaration
bool VerifyAndClearExpectationsLocked()
^
puis littéralement des centaines d'erreurs de syntaxe ou de définition similaires pointant toutes vers des fichiers dans GMock.
j'ai jeté un oeil à gmock-spec-builder.h:134
, et j'ai trouvé ce qui suit (dans un certain contexte) :
// Verifies that all expectations on this mock function have been
// satisfied. Reports one or more Google Test non-fatal failures
// and returns false if not.
bool VerifyAndClearExpectationsLocked()
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);
ce qui m'a amené à croire que GTEST_EXCLUSIVE_LOCK_REQUIRED_
il peut s'agir d'une macro qui, pour une raison quelconque, n'a pas été définie.Et en effet, après avoir fouillé tous les fichiers d'en-tête inclus à partir de l'un ou l'autre gmock/gmock.h
ou gtest/gtest.h
Je n'ai toujours pas trouvé la définition de cette macro.
Qu'est-ce que je fais de mal ici ?
MISE À JOUR:
J'ai pu produire un exemple minimal, même simple :
// in file mock-test.cpp
#include <gmock/gmock.h>
// Yeah, that's the only content
Compiler avec
g++ -o mock-test.o -c mock-test.cpp
Provoque la même erreur.
J'ai installé GMock via sudo apt-get install google-mock
, ce qui m'a donné un dossier sous /usr/src
où je pourrais courir cmake .
suivi de make
pour générer des fichiers de bibliothèque dans lesquels j'ai copié /usr/lib
.Les fichiers d'en-tête étaient déjà dans /usr/include
donc je n'ai rien fait manuellement à leur sujet.
La solution
J'ai eu la même erreur lorsque j'ai essayé de compiler en utilisant gmock 1.7 avec gtest 1.6.Assurez-vous que vous utilisez la même version de gtest.
Autres conseils
Je ne sais pas comment utiliser g-mock dans gcc
.Mais fondamentalement, nous l'utilisons dans des fenêtres comme celle-ci.Vos définitions de classe sont correctes.Avez-vous utilisé ces fonctions comme
EXPECT_CALL(classobj, exact functionname as it looks in definition).AtLeast(Times(0)).Return(0);
alors
classobj.exact functionname as it looks in definition()
Essayez ceci, je pense que cela devrait fonctionner.Si vous le souhaitez en détail, faites-le-moi savoir, je développerai la même chose avec un exemple typique.
Il y a les sources et en-têtes appropriés dans le dossier /usr/src/gmock.
Votre travail consiste uniquement à écraser tout le contenu des dossiers :
/usr/src/gmock/gtest/src -> /usr/src/gtest/src /usr/src/gmock/gtest/cmake -> /usr/src/gtest/cmake /usr/src/gmock/gtest/CMakeLists.txt-> /usr/src/gtest/CMakeLists.txt /usr/src/gmock/gtest/include/gtest -> /usr/include/gtest/