我什至还没有开始测试,即使我正确地遵循了 GMock 的文档,我也遇到了 GMock 的 MOCK_METHOD 宏的一些语法问题。会不会是编译器的问题?我有:
MingGW (GCC 4.9.2)
谷歌测试 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));
};
Run Code Online (Sandbox Code Playgroud)
我看到 3 个编译器错误:
错误 1:关于函数名
MockSimpleClass.cpp:18:24: 错误:
'simpleSecondFunction' 不是一个类型 MOCK_METHOD(int, simpleSecondFunction(int a, int b), (override));
错误 2:关于输入参数
MockSimpleClass.cpp:18:46: 错误:
'(' token MOCK_METHOD(int, simpleSecondFunction, (int a, int b), (override)) 之前的预期标识符;
错误 3:关于“覆盖”周围的括号
MockSimpleClass.cpp:18:60: 错误:
'(' token MOCK_METHOD(int, simpleSecondFunction(int a, int b), (override)) 之前的预期标识符;
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
如您所见,其中包含系统标头。我去检查系统上的 googletest 版本(Ubuntu 19.10):
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 。检查了 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 的新手,请检查他们的网页cmake-data并在debian 软件包中找到很多很棒的东西。
在 cmake 配置步骤之后,我在文件中看到这个定义flags.cmake:
CXX_INCLUDES = -I/home/dpoliaru/.local/include
通过正确的包含路径,我成功地编译了该项目。希望有帮助。
听起来 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));
};
Run Code Online (Sandbox Code Playgroud)