MOCK_METHOD名称后必须带有'::',该名称必须是类或名称空间名称

时间:2020-01-23 20:58:42

标签: c++ visual-studio googletest gmock googlemock

给出接口类Foo:

#ifndef FOO_H
#define FOO_H
#include <string>
class Foo
{
    public:
        Foo() = default;
        virtual ~Foo() = default;
        virtual void bar(std::string msg) = 0;
};
#endif

其模拟:

#ifndef FOO_MOCK_H
#define FOO_MOCK_H
#include "gtest/gtest.h"
#include "gmock/gmock.h"
class MockFoo: public Foo
{
    public:
        MOCK_METHOD(void, bar, (std::string), (override));
};
#endif

一个愚蠢的测试:

#include "pch.h"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "MockFoo.h"

using ::testing::NiceMock;

TEST(SillyTests, Silly)
{
    std::string msg = "Hello, world!";
    NiceMock<MockFoo> mock_foo;
    EXPECT_CALL(mock_foo, bar)
        .Times(1);
    mock_foo.bar(msg);
}

在一系列关于gtest和gmock的内部错误中,Visual Studio抱怨MOCK_METHOD()“后跟'::'的名称必须是类或名称空间的名称”,并且{{ 1}}。

有趣的是,添加旧函数调用MOCK_METHOD会产生相同的错误。

MOCK_METHODn

将鼠标悬停在MOCK_METHOD1(debug, void(std::string msg)); 上会显示几个静态断言,但是它们似乎并不正确。其中包括:

  • MOCK_METHOD应该放在括号中(是)
  • "(std::string)"应该放在括号中(再次是)
  • 签名必须是函数类型,可能返回类型包含不受保护的逗号(它是"(override)"类型,加上括号不能解决这个问题)
  • 此方法不使用“ 1”参数。在所有类型旁加上逗号,不要加保护符

gmock版本为1.10.0,Google Test适配器版本为1.8.1.3。

1 个答案:

答案 0 :(得分:1)

解决了。 googlemock和googletest不共享相同版本的原因。将googlemock降级至v1.8.1即可解决此问题。