给出接口类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)"
类型,加上括号不能解决这个问题)gmock版本为1.10.0,Google Test适配器版本为1.8.1.3。
答案 0 :(得分:1)
解决了。 googlemock和googletest不共享相同版本的原因。将googlemock降级至v1.8.1即可解决此问题。