Warm tip: This article is reproduced from serverfault.com, please click

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

(c++ - MOCK_METHOD name must be followed by '::' must be a class or namespace name)

发布于 2020-01-23 20:58:42

给定一个接口类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()“名称后跟'::'必须是类或名称空间名称”,并且找不到函数定义MOCK_METHOD

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

MOCK_METHOD1(debug, void(std::string msg));

将鼠标悬停在MOCK_METHOD显示上有几个静态断言,但它们似乎并不正确。他们包括:

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

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

Questioner
esilk
Viewed
0
esilk 2020-01-25 00:21:13

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