我什至没有开始测试,即使我正确地遵循了GMock的文档,我也遇到了GMock的MOCK_METHOD宏的一些语法问题。可能是编译器问题吗?我有:
MingGW(GCC 4.9.2)
Googletest 1.10.x
class SimpleClass {
public:
virtual int simpleFirstFunction(int a, int b) { return (a + simpleSecondFunction(b)); }
virtual int simpleSecondFunction(int b) { return (2 * b); }
virtual ~SimpleClass();
};
class MockSimpleClass :public SimpleClass {
MOCK_METHOD(int, simpleSecondFunction, (int a, int b), (override));
};
我看到3个编译器错误:
错误-1:关于函数名称
MockSimpleClass.cpp:18:24:错误:
'simpleSecondFunction'不是类型 MOCK_METHOD(int,simpleSecondFunction(int a,int b),(override));
错误2:关于输入参数
MockSimpleClass.cpp:18:46:错误:
'('标记之前的预期标识符 MOCK_METHOD(int,simpleSecondFunction,(int a,int b),(override));
错误3:关于“替代”周围的括号
MockSimpleClass.cpp:18:60:错误:
'('标记之前的预期标识符 MOCK_METHOD(int,simpleSecondFunction(int a,int b),(override));
答案 0 :(得分:2)
MOCK_METHOD宏未定义。 这是我对完全相同的问题进行故障排除的方法:
检查预处理器:gcc -E s1.cpp > s1.preproc
。
首先检查包含的gmock.h
。
就我而言,是:
72396 # 11 "s1.cpp" 2
72397 # 1 "/usr/include/gmock/gmock.h" 1 3 4
如您所见,其中包含系统标题。
我希望检查系统(Ubuntu 19.10)上的googletest版本:
doliaru@host:~/test/gtest/build$ dpkg -l google*
rc google-mock:amd64 1.8.1-3 aand using C++ mock classes
ii googletest:amd64 1.8.1-3 amd64 Google's C++ test frame
dpoliaru@host:~/test/gtest/build$
显然,此功能未在1.8中实现。
我克隆了最新版本的googletest here。
检查完master分支上最上面的CMakeLists.txt
后,我看到了
master上的当前gtest版本是:
set(GOOGLETEST_VERSION 1.10.0)
我用以下cmake配置构建了它:
cmake .. -D CMAKE_INSTALL_PREFIX=/home/dpoliaru/.local/ -D gtest_build_samples=TRUE
安装完成后,gmock在这里是我需要的项目:
/home/dpoliaru/.local/include/gmock/gmock.h
因此,我使用给定目标的正确包含目录更新了项目的CMakeLists.txt
文件:
...
target_include_directories(${PROJECT_NAME} PUBLIC ${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS})
...
如果您不熟悉cmake,请检查他们的webpage,并在cmake-data
debian软件包中找到很多很棒的东西。
在cmake配置步骤之后,我在flags.cmake
文件中看到以下定义:
CXX_INCLUDES = -I/home/dpoliaru/.local/include
使用适当的包含路径,我设法编译了项目。 希望有帮助。
答案 1 :(得分:1)
听起来好像未定义MOCK_METHOD宏。您是否正确设置了包含路径,并在文件顶部添加了#include "gmock/gmock.h"
指令?您还缺少public
访问说明符,并且该函数的参数数量错误。
如果您的包含路径上有gmock标头,则此方法应该起作用:
#include "gmock/gmock.h"
class SimpleClass {
public:
virtual int simpleFirstFunction(int a, int b) { return (a + simpleSecondFunction(b)); }
virtual int simpleSecondFunction(int b) { return (2 * b); }
virtual ~SimpleClass();
};
class MockSimpleClass : public SimpleClass {
public:
MOCK_METHOD(int, simpleSecondFunction, (int b), (override));
};