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

时间:2019-10-26 22:13:27

标签: c++ gmock

我什至没有开始测试,即使我正确地遵循了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));

2 个答案:

答案 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));
};