GMock 不编译,带有用户类型引用参数的虚函数
GMock doesn't compile, virtual function with user type reference argument
我正在尝试模拟一个抽象 class 但我不断从 GMock headers 内部收到编译错误。我无法分享实际代码,但与下面几乎相同。模拟工作正常,但我不得不更改 "DoStuff" 函数以获取 object 但引用。从那时起它就不会编译。错误类似于 * GMock 无法将 "Element" 与 long long * 进行比较。
"C++ code"
using ::testing::NiceMock;
class Element{};
class Foo
{
public:
virtual void DoStuff(Element&) = 0;
};
class MockFoo : public Foo
{
public:
MockFoo() {};
MOCK_METHOD1(DoStuff, void(Element&));
};
TEST(example, test)
{
NiceMock<MockFoo> mf;
Element element{};
EXPECT_CALL(mf, DoStuff(element)).Times(1);
mf.DoStuff(element);
}
看看generic comparisons matchers.
如果您想检查通过 mf.DoStuff
传递给模拟对象的完全相同的元素 - 使用 ::testing::Ref
匹配器:
EXPECT_CALL(mf, DoStuff(Ref(element)));
(注意:Times(1) 是默认值 - 所以不是必需的)。
如果您想检查传递的对象是否具有完全相同的值 - 为其定义比较运算符 - 或者使用一些适当的匹配器 - 如 ::testing::Property
- 如:
EXPECT_CALL(mf, DoStuff(AllOf(Property(&Example::getX, expectedXValue),
Property(&Example::getY, expectedYValue))));
我猜你的确切问题是因为你的实际 Example
class 是抽象的 and/or 没有 operator ==
- 所以默认匹配器 ::testing::Eq
不能用过。
我正在尝试模拟一个抽象 class 但我不断从 GMock headers 内部收到编译错误。我无法分享实际代码,但与下面几乎相同。模拟工作正常,但我不得不更改 "DoStuff" 函数以获取 object 但引用。从那时起它就不会编译。错误类似于 * GMock 无法将 "Element" 与 long long * 进行比较。
"C++ code"
using ::testing::NiceMock;
class Element{};
class Foo
{
public:
virtual void DoStuff(Element&) = 0;
};
class MockFoo : public Foo
{
public:
MockFoo() {};
MOCK_METHOD1(DoStuff, void(Element&));
};
TEST(example, test)
{
NiceMock<MockFoo> mf;
Element element{};
EXPECT_CALL(mf, DoStuff(element)).Times(1);
mf.DoStuff(element);
}
看看generic comparisons matchers.
如果您想检查通过 mf.DoStuff
传递给模拟对象的完全相同的元素 - 使用 ::testing::Ref
匹配器:
EXPECT_CALL(mf, DoStuff(Ref(element)));
(注意:Times(1) 是默认值 - 所以不是必需的)。
如果您想检查传递的对象是否具有完全相同的值 - 为其定义比较运算符 - 或者使用一些适当的匹配器 - 如 ::testing::Property
- 如:
EXPECT_CALL(mf, DoStuff(AllOf(Property(&Example::getX, expectedXValue),
Property(&Example::getY, expectedYValue))));
我猜你的确切问题是因为你的实际 Example
class 是抽象的 and/or 没有 operator ==
- 所以默认匹配器 ::testing::Eq
不能用过。