为什么 MOCK_METHOD 语法在 GMock 中不起作用?

sof*_*ver 5 c++ googlemock

我什至还没有开始测试,即使我正确地遵循了 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)) 之前的预期标识符;

dmy*_*ush 5

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

通过正确的包含路径,我成功地编译了该项目。希望有帮助。


Jon*_*nAP 2

听起来 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)