我正在尝试使用Google Mock测试抽象类。遵循forDummies指南,我构造了类(class)的模拟:
AbstractFoo.h
class AbstractFoo {
public:
virtual void setSize(int w, int h) = 0;
void setSize(const QSize& s); // implemented as calling above function
}
MockFoo.h
#include "gmock/gmock.h"
class MockFoo : public AbstractFoo {
public:
MOCK_METHOD2(setSize, void(int w, int h));
}
FooTest.cpp
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "MockFoo.h"
TEST(AbstractFoo, MethodSetSize) {
MockFoo foo;
EXPECT_CALL(foo, setSize(5, 5)).Times(1);
foo.setSize(QSize(5, 5)); // this line produces compiler error
}
标记的行产生以下编译器错误:
我的理解是,由于
MockFoo
扩展了AbstractFoo
,因此它应该继承setSize(QSize)
方法。但是,事实并非如此。我怎样才能解决这个问题?针对代码错误进行编辑
最佳答案
模拟类中方法的签名错误:
MOCK_METHOD2(setSize, bool(int w, int h));
基类具有带有此签名的方法:
virtual void setSize(int w, int h) = 0;
我不确定您使用的是哪个编译器,但这应该是编译器错误。
修复签名,错误应该消失:
MOCK_METHOD2(setSize, void(int w, int h));
另外,
class MockFoo : AbstractFoo
应该
class MockFoo : public AbstractFoo
您的问题与googlemock库无关,而与c++无关。由于[class.virtual] / 1,您无法实现的目标。
下一个示例演示了相同的问题:
struct A
{
A(int h,int l):x(h),y(l){}
int x; int y;
};
class AbstractFoo {
public:
virtual void setSize(int w, int h) = 0;
void setSize(const A& s){setSize(s.x,s.y);}
};
class MockFoo : public AbstractFoo
{
public:
void setSize(int , int ){}
};
int main()
{
MockFoo f;
A a(5,5);
f.setSize( a );
}
您可以通过重命名
setSize(const QSize& s)
方法或将MockFoo
对象转换为AbstractFoo&
然后调用此方法来解决此问题。您还可以查看NVI,因为它看起来像您尝试做的那样。
关于c++ - 在Google Mock上调用重载函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17540986/